Отклонение аннотации в псевдонимах типа
Недавно я заметил, что аннотации к дисперсиям могут использоваться в псевдонимах типов. Вот пример из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>
Итак, чего мне не хватает? Какова цель аннотаций дисперсии в псевдонимах типа? Можете ли вы привести пример псевдонима типа с аннотациями отклонений, которые будут отличаться от исходного типа.