Anotaciones de varianza en los alias de tipo

Recientemente he notado que las anotaciones de varianza se pueden usar en alias de tipo. Aquí hay un ejemplo dePredef:

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

Y empecé a pensar, donde podría ser utilizado. Obviamente, no puede cambiar la varianza a la opuesta, o hacer que un tipo invariante se comporte como co o contravariante. El compilador lanzará un error, 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>

Pero, puedes hacer que algún tipo de variante se comporte como invariante (al menos, el compilador no discute con eso). Entonces, traté de hacer una versión invariante deList

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

Pero esta nueva invarianteList Todavía se comporta igual que su versión 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>

Entonces, ¿qué me falta? ¿Cuál es el propósito de las anotaciones de varianza en los alias de tipo? ¿Puede dar un ejemplo de alias de tipo con anotaciones de varianza, que diferirá del tipo original?

Respuestas a la pregunta(2)

Su respuesta a la pregunta