When is @uncheckedVariance needed in Scala, and why is it used in GenericTraversableTemplate?
- by retronym
@uncheckedVariance can be used to bridge the gap between Scala's declaration site variance annotations and Java's invariant generics.
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] :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
This says that java.util.Comparator is naturally contra-variant, that is the type parameter T appears in parameters and never in a return type.
Which begs the question, why is it also used in the Scala collections library:
trait GenericTraversableTemplate[+A, +CC[X] <: Traversable[X]] extends HasNewBuilder[A, CC[A] @uncheckedVariance]
What are the valid uses for this annotation?