Scala 2.11类型方差更改

vir*_*yes 5 scala variance implicits

在Scala 2.10.4中,这编译:

trait Foo[-U,T]{
  type Contra = U
}
Run Code Online (Sandbox Code Playgroud)

但是在2.11.0中同样失败了:

逆变型U出现在类型为反对特征Foo的类型U的不变位置[-U,T] {类型Contra = U}

有可用的解决方法吗?试图将Scala库移植到2.11并且需要逆变类型以获得编译器拾取的大量隐式defs(即使U不变量似乎不是一个选项).

谢谢

whe*_*ies 4

我无法想象有可用的解决方法。我之所以这么说是因为支持路径依赖类型:

 def foo[T <: Foo[A,B]](that: T): that.Contra
Run Code Online (Sandbox Code Playgroud)

这会将Contra类型放置在错误的位置。您不能将逆变类型作为运算结果返回。也许这些的搜索和验证需要大量的工作,以至于编译器作者认为这个小极端情况造成了太大的负担,或者它是您发现的编译器错误。

顺便说一句,这只是我的疯狂猜测。我必须阅读编译器代码才能弄清楚哪种方式是哪种。