在尝试理解 scala 的类型系统时,我遇到了 F 有界类型的存在量化。
让A成为一个类型
trait A[F <: A[F]] { self: F => }
其中F是 的 F 有界自类型A。
还有B一些亚型A
case class B() extends A[B]
如果我尝试用存在量化声明 a ListofA
val a: List[T] forSome { type T <: A[T] }
分配a的List时出现错误B。由于某种原因,scala 推断出 type List[A[Nothing]]。
val a: List[T] forSome { type T <: A[T] } = List(B()) // type mismatch
当应用简化规则 4(如scala-spec中所述)时,协变的出现T可能会被上限替换(这里A[T]:)
val b: List[A[T]] forSome { type T <: A[T] } = List(B())
这两个例子应该是等价的(如果我没有误解的话),但简化的例子很好。此外,以下也是正确的,应该是等价的:
val c: List[T forSome { type T <: A[T] }] = List(B())
但是由于某种原因,类型c和类型b不相等。
所以我的问题是:这是 scala 编译器的错误还是我误解了一些重要的东西?
编辑:我的假设是否正确,即 和 的类型c不b相等,因为存在量化中c没有看到 的协变出现T?