考虑以下代码段:
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)