Рассмотрим следующий фрагмент:
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)