Scala 2.11类型方差更改

时间:2014-04-30 09:44:49

标签: scala variance implicits

在Scala 2.10.4中编译:

trait Foo[-U,T]{
  type Contra = U
}

但是在2.11.0中同样失败了:

  

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

是否有可用的解决方法?试图将Scala库移植到2.11并且需要逆变类型以便获得编译器拾取的大量隐式定义(即,使U不变量似乎不是一种选择)。

由于

2 个答案:

答案 0 :(得分:4)

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

 def foo[T <: Foo[A,B]](that: T): that.Contra

Contra类型置于错误的位置。作为操作的结果,您不能返回逆变类型。也许对这些内容的搜索和验证需要做大量工作,以至于编译器作者认为这个小角落案例造成了太多的负担这是你发现的编译器错误。

顺便说一句,这只是我的疯狂猜测。我必须阅读编译器代码以确定哪种方式。

答案 1 :(得分:4)

在类型检查器中显然是2.7之后和2.11之前的this was a bug。现在预防OP中的方法是一个特征,这是一件好事,有点o_O

解决方法是像2.11之前那样做,不同之处在于,现在你 知道 你自己,而不是你自己以为编译器有你的回复。

无知是幸福,对吧?

解决方法:

import annotation.unchecked._
trait Foo[-U,T]{
  type Contra = (U @uncheckedVariance)
}