Рассмотрим следующий фрагмент:
trait X[-T]
object Y extends X[Nothing]
def a[T](x: X[T]): X[T] = x
a(Y)
Компиляция вышеизложенного (2.12.3) не выполняется:
type mismatch;
found : Y.type
required: X[T]
a(Y)
^
Это компилируется отлично, если:
- используется другой тип, чем
Nothing(например,object Y extends X[String]) - метод
aне используетTв своем возвращаемом типе (например,def a[T](x: X[T]): Unit = {}) - параметр типа для
aявно задан (т.е.a[Nothing](Y)) -
Tявляется ковариантным, а не контравариантным (также терпит неудачу, если он инвариантен)
Это какой-то особый случай в компиляторе для Nothing?
Как "интересная" работа, кажется, что все работает нормально:
trait X[-T]
object Y extends X[Nothing]
def a[T, U <: T](x: X[T]): X[U] = x
a(Y)