Varianzanmerkungen in Typ-Aliasen

Kürzlich habe ich festgestellt, dass Varianz-Annotationen in Typ-Aliasen verwendet werden können. Hier ist ein Beispiel vonPredef:

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

Und ich begann zu überlegen, wo es eingesetzt werden könnte. Offensichtlich können Sie die Varianz nicht in das Gegenteil ändern oder einen invarianten Typ als co- oder contravariant verhalten. Der Compiler wird einen solchen Fehler auslösen

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

Sie können jedoch einen Variantentyp so definieren, dass er sich wie eine Invariante verhält (zumindest würde der Compiler dem nicht widersprechen). Also habe ich versucht, eine unveränderliche Version von zu erstellenList

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

Aber diese neue InvarianteList verhält sich immer noch so, als wäre es die ursprüngliche kovariante Version:

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

Also, was fehlt mir? Was ist der Zweck von Varianz-Annotationen in Typ-Aliasen? Können Sie ein Beispiel für einen Typalias mit Abweichungsannotationen nennen, der vom ursprünglichen Typ abweicht?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage