【发布时间】:2014-06-16 13:51:24
【问题描述】:
在 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 并且需要逆变类型才能让编译器获取大量隐式 def(即,使 U 保持不变似乎不是一种选择)。
谢谢
【问题讨论】:
-
您能详细解释一下如何使用类型成员和逆变来控制隐式解析吗?我有兴趣了解更多有关此问题的信息,也许在问题更深的地方有解决方法。
-
你能用
type Contra >: U吗? -
@n.m.我不能使用 Contra >: U 作为依赖于 U 的实例,期望 U 而不是 U 的超类型(即,当尝试这种方法时,编译器会说方法 X 不是 Contra 的成员)
-
@wingedsubmariner U 必须是 Foo 的逆变类型参数,但 U 是整个库中使用的隐式证据中的协变类型。基本上,在 Foo 中,Contra 必须完全等于 U,但在其他任何地方都被视为 contra/covariant。 2.11 的快速和肮脏是
@uncheckedVariance -
但是您可以将 U 的某些超类型传递给扩展 Foo 的类,情况完全相同。