Adnotacje wariancji w aliasach typów

Ostatnio zauważyłem, że adnotacje wariancji mogą być używane w aliasach typów. Oto przykład zPredef:

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

I zacząłem myśleć, gdzie można go użyć. Oczywiście nie można zmienić wariancji na przeciwną, ani sprawić, by niezmienny typ zachowywał się jak współ- lub przeciwstawny. Kompilator rzuci błąd, taki jak ten

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

Ale możesz sprawić, że jakiś typ wariantu będzie zachowywał się jak niezmiennik (przynajmniej kompilator nie będzie się z tym sprzeczał). Próbowałem więc stworzyć niezmienną wersjęList

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

Ale ten nowy niezmiennikList nadal zachowuje się tak, jak oryginalna wersja kowariantna:

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

Więc czego mi brakuje? Jaki jest cel adnotacji wariancji w aliasach typów? Czy możesz podać przykład aliasu typu z adnotacjami wariancji, który różni się od oryginalnego typu.

questionAnswers(2)

yourAnswerToTheQuestion