在 Scala 2.10.4 中编译:
trait Foo[-U,T]{
type Contra = U
}
但在 2.11.0 中同样失败:
逆变类型 U 出现在类型 U 的不变位置,类型为 Contra trait Foo[-U,T] {type Contra = U}
有可用的解决方法吗?尝试将 Scala 库移植到 2.11 并且需要逆变类型才能让编译器拾取大量隐式定义(即,使 U 不变似乎不是一种选择)。
谢谢
我无法想象有可用的解决方法。我说这一切的原因都是为了支持依赖路径的类型:
def foo[T <: Foo[A,B]](that: T): that.Contra
这会将Contra
类型放置在错误的位置。您不能作为操作的结果返回逆变类型。也许这些的搜索和验证需要大量工作,以至于编译器作者认为这个小角落案例造成了太多负担,或者它是您发现的编译器错误。
顺便说一句,这只是我的疯狂猜测。我必须阅读编译器代码才能确定哪种方式是哪种方式。
显然,在 2.7 之后和 2.11 之前,这是类型检查器中的一个错误。现在OP中的预防方法是一个特性,这是一件好事,有点像o_O
解决方法是像 2.11 之前的那样做,不同之处在于现在你知道你自己一个人,而不是之前你认为编译器支持你的地方。
无知是幸福的,对吧?
解决方法:
import annotation.unchecked._
trait Foo[-U,T]{
type Contra = (U @uncheckedVariance)
}