Отклонение аннотации в псевдонимах типа

Недавно я заметил, что аннотации к дисперсиям могут использоваться в псевдонимах типов. Вот пример изPredef:

<code>type Function[-A, +B] = Function1[A, B]
</code>

И я начал думать, где это можно использовать. Очевидно, что вы не можете изменить дисперсию на противоположную или создать инвариантный тип, который будет вести себя как ко- или контравариантный. Компилятор выдаст ошибку, вот так

<code>scala> type BrokenFunc[+T, -R] = Function1[T, R]
<console>:7: error: covariant type T occurs in contravariant position in type 
  [+T, -R]T => R of type BrokenFunc
</code>

Но вы можете заставить некоторый вариантный тип вести себя как инвариант (по крайней мере, компилятор с этим не поспорит). Итак, я попытался сделать инвариантную версиюList

<code>scala> type InvList[T] = List[T]
defined type alias InvList
</code>

Но этот новый инвариантList по-прежнему ведет себя так же, как и оригинальная ковариантная версия:

<code>scala> val l: InvList[String] = List("foo")
l: InvList[String] = List(foo)

scala> val anyList: InvList[Any] = l
anyList: InvList[Any] = List(foo)
</code>

Итак, чего мне не хватает? Какова цель аннотаций дисперсии в псевдонимах типа? Можете ли вы привести пример псевдонима типа с аннотациями отклонений, которые будут отличаться от исходного типа.

Ответы на вопрос(2)

Ваш ответ на вопрос