为什么scalac仅使用某些访问修饰符发出方差错误?

时间:2015-03-24 17:13:15

标签: scala collections types covariance access-modifiers

此代码无法编译:

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的类型系统如何工作缺失了一些东西。为什么编译器会以这种方式运行?

0 个答案:

没有答案