这工作:
trait Test2 {
val x: Gen[A, X] forSome { type A; type X <: MyTrait[A] }
println(x.baseV.v1)
}
我相信问题是
Gen[_, _]
Has to mean
Gen[_ >: Nothing <: Any, _ >: Nothing <: Any]
这和
Gen[A, X] forSome { type A; type X }
也就是说,尽管
Gen
说
X <: MyTrait[A]
,通配符不继承该绑定。您可以在这里看到类似的问题:
trait Data { def data: String }
trait Box[A <: Data] { def data: A }
def unbox(b: Box[_]): String = b.data.data // nope; the wildcard is not <: Data
我们可以显式地向通配符添加边界。但是,由于第二个通配符上的绑定依赖于第一个通配符,因此我们必须使用扩展的
forSome
存在的语法,因此我们可以命名
A
使用两次。
Gen[A, _ <: MyTrait[A]] forSome { type A }
我选择把所有的东西都放在存在性条款中,这相当于:
Gen[A, X] forSome { type A; type X <: MyTrait[A] }
您也可以使用
Gen[_, _ <: MyTrait[_]]
但这不是等价的,因为它不涉及左右参数。如果
Gen[A, _]
包含一个
一
除了
MyTrait[A]
然后使用
x: Gen[_, _ <: MyTrait[_]]
将使用不兼容的类型呈现“bare”值和“wrapped”值。