Почему скаляк только генерирует ошибки отклонения с определенными модификаторами доступа?

Этот код не компилируется:

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 ответов

Другие вопросы по тегам