Цитирование из спецификации, раздел 4.5 Примечания к отклонениям:
Примечания к отклонениям показывают, как экземпляры параметризованных типов изменяются в зависимости от подтипа (§3.5.2).Дисперсия «+» указывает ковариантную зависимость, дисперсия «-» указывает контравариантную зависимость, а указание отсутствующей дисперсии указывает инвариантную зависимость.Отклонение от аннотации ограничивает способ отображения аннотированной переменной типа в типе или классе, который связывает параметр типа.В типе определения типа T [tps] = S или тип объявления типа T [tps]>: L <: параметры типа U с пометкой + 'должны появляться только в ковариантной позиции, тогда как параметры типа с пометкой' - 'должны появляться только в контравариантнойposition. </p>
Поэтому параметр типа по умолчанию считается инвариантным.Вы должны явно аннотировать параметр типа, чтобы он был или со-или контравариантным, если вы хотите использовать это.Кроме того, совершенно законно использовать аннотации отклонений для параметра типа, который вообще не используется (хотя его может быть не так полезно).Например:
scala> class A[+T, -S] {def myMethod(s: String) = println(s)}
defined class A
scala> class A2[T] {def myMethod(t: T) = println(t)}
defined class A2
scala> class A3[-T] {def myMethod(t: T) = println(t)}
defined class A3
scala> val a1 = new A2[Any]
a1: A2[Any] = A2@1cd1cea
scala> val a2: A2[Int] = a1
:6: error: type mismatch;
found : A2[Any]
required: A2[Int]
val a2: A2[Int] = new A2[Any]
scala> val a3 = new A3[Any]
a3: A3[Any] = A3@875dee
scala> val a4: A3[Int] = a3
a5: A3[Int] = A3@875dee
Отклоняющая аннотация в классе A3, которая в данном примере противоречива, позволяет считать, что A3 [Any] считается подтипом A3 [Int], выполняя присвоение из экземпляра a4до а3 легальный.Это не удастся, если вы не используете аннотацию отклонений.