Anotações de variação em aliases de tipo

Recentemente, notei que as anotações de variação podem ser usadas em alias de tipo. Aqui está um exemplo dePredef:

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

E comecei a pensar onde poderia ser usado. Obviamente, você não pode alterar a variância para oposto, ou fazer um tipo invariante para se comportar como co-ou contravariante. O compilador lançará um erro, como este

<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>

Mas, você pode fazer algum tipo de variante para se comportar como invariante (pelo menos, o compilador não argumentaria com isso). Então, eu tentei fazer uma versão invariante deList

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

Mas esta nova invarianteList ainda se comporta como se fosse a versão covariante original:

<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>

Então, o que eu sinto falta? Qual é o objetivo das anotações de variação nos alias de tipo? Você pode dar um exemplo de alias de tipo com anotações de variação, que serão diferentes do tipo original.

questionAnswers(2)

yourAnswerToTheQuestion