@uncheckedVariance
se puede utilizar para cerrar la brecha entre las anotaciones de varianza del sitio de declaración de Scala y los genéricos invariables de Java.¿Cuándo se necesita @uncheckedVariance en Scala, y por qué se usa en GenericTraversableTemplate?
scala> import java.util.Comparator
import java.util.Comparator
scala> trait Foo[T] extends Comparator[T]
defined trait Foo
scala> trait Foo[-T] extends Comparator[T]
<console>:5: error: contravariant type T occurs in invariant position in type [-T]java.lang.Object with java.util.Comparator[T] of trait Foo
trait Foo[-T] extends Comparator[T]
^
scala> import annotation.unchecked._
import annotation.unchecked._
scala> trait Foo[-T] extends Comparator[T @uncheckedVariance]
defined trait Foo
Esto dice que java.util.Comparator es, naturalmente, contra-variante, que es el parámetro de tipo T
aparece en los parámetros y nunca en un tipo de retorno.
Esto plantea la pregunta: ¿por qué también se utiliza en la biblioteca de colecciones de Scala que no se extiende desde las interfaces de Java?
trait GenericTraversableTemplate[+A, +CC[X] <: Traversable[X]] extends HasNewBuilder[A, CC[A] @uncheckedVariance]
¿Cuáles son los usos válidos para esta anotación?
Muy buena pregunta! –