Почему скаляк только генерирует ошибки отклонения с определенными модификаторами доступа?
Этот код не компилируется:
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. Почему компилятор ведет себя так?