此代码无法编译:
trait Invariant[T]
trait Covariant[+T] {
protected val example: Invariant[T]
}
error: covariant type T occurs in invariant position in type => Invariant[T] of value example
protected val example: Invariant[T]
^
one error found
但是,这段代码编译得很好:
trait Invariant[T]
trait Covariant[+T] {
protected[this] val example: Invariant[T]
}
经过一些实验后,似乎只有在访问修饰符没有限定为this
时才会出现方差错误。这两个都失败了:
val example: Invariant[T]
private val example: Invariant[T] = ???
虽然private[this]
也有效。
当类型是逆变而不是不变时,我看到类似的行为。
我觉得我对Scala的类型系统如何工作缺失了一些东西。为什么编译器会以这种方式运行?