@uncheckedVariance
kann verwendet werden, um die Lücke zwischen Scala Deklaration Site Varianz Annotationen und Javas invarianten Generics zu überbrücken. und nie in einem RückgabetypWann wird @uncheckedVariance in Scala benötigt und warum wird es in GenericTraversableTemplate verwendet?
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
Dies sagt, dass java.util.Comparator natürlich kontravarianten ist, das ist der Typ-Parameter T
in Parametern angezeigt.
Dies wirft die Frage auf: warum wird es auch in der Scala Collections-Bibliothek verwendet, die nicht von Java-Schnittstellen ausgeht?
trait GenericTraversableTemplate[+A, +CC[X] <: Traversable[X]] extends HasNewBuilder[A, CC[A] @uncheckedVariance]
Was sind die gültigen Verwendungen für diese Annotation?
Gute Frage! –