Недавно я заметил, что аннотации вариаций могут использоваться в псевдонимах типов. Вот пример из Predef
:
type Function[-A, +B] = Function1[A, B]
И я начал думать, где его можно было использовать. Очевидно, вы не можете изменить дисперсию на противоположную, или сделать инвариантный тип, чтобы вести себя как ко- или контравариантный. Компилятор выдает ошибку, например,
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
Но вы можете сделать некоторый тип варианта, чтобы вести себя как инвариант (по крайней мере, компилятор не стал бы спорить с этим). Итак, я попытался сделать инвариантную версию List
scala> type InvList[T] = List[T]
defined type alias InvList
Но этот новый инвариант List
все еще ведет себя так же, как и исходная ковариантная версия:
scala> val l: InvList[String] = List("foo")
l: InvList[String] = List(foo)
scala> val anyList: InvList[Any] = l
anyList: InvList[Any] = List(foo)
Итак, что мне не хватает? Какова цель аннотации изменений в псевдонимах типов? Можете ли вы привести пример псевдонима типа с аннотациями дисперсии, которые будут отличаться от исходного типа.