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.