【发布时间】:2017-10-09 09:06:31
【问题描述】:
考虑以下 sn-p:
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)
【问题讨论】:
标签: scala scala-compiler