[英]Type inference with existential type
我有一個通用特征SomeTrait
定義為:
trait SomeTrait[T] {
def foo(t: T): String
}
和方法bar
和qux
一樣:
def bar[T](t: SomeTrait[T]): T
def qux: List[SomeTrait[_]]
我無法控制以上內容。 我正在嘗試對qux
返回的列表進行操作,就像這樣
qux map { x => x.foo(bar(x))}
但是,編譯器抱怨類型不匹配。 據我所知,這應該沒問題。
我嘗試添加一個通用方法(簽名[T](SomeTrait[T])String
),然后調用它來完成工作,但是編譯器仍然抱怨。 我可以這樣處理:
qux map { x =>
val casted = x.asInstanceOf[SomeTrait[T forSome { type T }]] // !!!
casted.foo(bar(casted))
}
但這更加令人困惑,因為x
已經具有SomeTrait[_]
類型和SomeTrait[T forSome { type T }]
意味着同一件事。 我知道的唯一區別是,前者是后者的簡寫,后者使編譯器創建自己的綜合名稱。 我希望有更好的方法可以做到這一點。 我已經看到了這個問題,但是我認為它不適用。
正確的方法是使用類型變量為T
命名:
qux map { case x: SomeTrait[t] => x.foo(bar(x)) }
這樣,編譯器就知道bar(x): t
,因此它是x.foo
的可接受參數。
或者,也可以將foo
和bar
組合為一個方法(請記住,方法可以是局部的,因此您可以在需要的地方定義它):
def fooOfBar[T](x: SomeTrait[T]) = x.foo(bar(x))
qux map { fooOfBar(_) }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.