3

在尝试理解 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] } 

分配aList时出现错误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 编译器的错误还是我误解了一些重要的东西?

编辑:我的假设是否正确,即 和 的类型cb相等,因为存在量化中c没有看到 的协变出现T

4

0 回答 0