5

在 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 不变似乎不是一种选择)。

谢谢

4

2 回答 2

4

我无法想象有可用的解决方法。我说这一切的原因都是为了支持依赖路径的类型:

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

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

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

于 2014-04-30T14:40:28.867 回答
4

显然,在 2.7 之后和 2.11 之前,这是类型检查器中的一个错误。现在OP中的预防方法是一个特性,这是一件好事,有点像o_O

解决方法是像 2.11 之前的那样做,不同之处在于现在你知道你自己一个人,而不是之前你认为编译器支持你的地方。

无知是幸福的,对吧?

解决方法:

import annotation.unchecked._
trait Foo[-U,T]{
  type Contra = (U @uncheckedVariance)
}
于 2014-05-01T06:09:49.803 回答