在尝试理解 scala 的类型系统时,我遇到了 F 有界类型的存在量化。
让A
成为一个类型
trait A[F <: A[F]] { self: F => }
其中F
是 的 F 有界自类型A
。
还有B
一些亚型A
case class B() extends A[B]
如果我尝试用存在量化声明 a List
ofA
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
?