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.