下面的類層次結構:爲什麼scala需要存在類型來限制泛型綁定?
trait Provider[A] {
def get(): Seq[A]
}
abstract class ProviderImpl[A] extends Provider[A] {
final override def get(): Seq[A] = Seq()
}
trait HasX {
def getX: Int
}
trait RefinedProvider[A <: HasX] extends Provider[A]
class TypedProviderImpl extends ProviderImpl[HasX] with RefinedProvider[HasX]
我希望能夠做到這一點:
val provider: RefinedProvider[_] = new TypedProviderImpl()
provider.get() map (_.getX)
但它不工作,因爲provider.get()
返回類型爲Seq[Any]
這似乎因爲它是RefinedProvider
,所以get()
應返回Seq[_ <: HasX]
。
問題:我可以用存在類型解決這個問題,但爲什麼編譯器不能爲我執行這個?
val provider: RefinedProvider[T] forSome { type T <: HasX } = ...
感謝@碧玉-M - 實際上,您的意見不回答這個問題:門票分規範,它說, 'A [_]'*總是等於'A [Any]'(如果我正確讀取的話)並且編譯器永遠不會應用更多的邊界。我也不知何故忘記了'[_ <:HasX]' - 我的用例比上面的更復雜,但我可以通過各種方法簽名來使它工作。你想做出完整的答案嗎? –
該規範非常明確,默認情況下,通配符「_」爲「_>:Nothing <:Any」。請參閱http://www.scala-lang.org/files/archive/spec/2.11/03-types.html#existential-types,「存在類型的佔位符語法」。 –