在尝试理解scala的类型系统时,我遇到了F-bounded类型的存在量化。
让A
成为一种类型
trait A[F <: A[F]] { self: F => }
其中F
是A
的F-bounded自我类型。
B
A
的某些子类型
case class B() extends A[B]
如果我尝试使用存在量化来声明List
A
val a: List[T] forSome { type T <: A[T] }
分配a
List
B
时出错。出于某种原因,scala推断出类型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
?