10
考虑下面的代码片段:无法推断逆变全无类型参数
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)
感谢您的回答,但为什么使用String而不是Nothing来让示例编译?或者为什么解决方法工作? – adamw