Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 2.11类型差异变化_Scala_Variance_Implicits - Fatal编程技术网

Scala 2.11类型差异变化

Scala 2.11类型差异变化,scala,variance,implicits,Scala,Variance,Implicits,在Scala 2.10.4中,它编译: trait Foo[-U,T]{ type Contra = U } 但在2.11.0中,同样的问题在以下方面失败: 逆变型U出现在类型U的不变位置 反特征Foo[-U,T]{type conta=U} 有解决办法吗?尝试将Scala库移植到2.11,需要使用逆变类型才能获得编译器获取的大量隐式def(即,使U不变量似乎不是一个选项) 谢谢我无法想象会有什么工作可做。我之所以这么说是为了支持路径相关类型: def foo[T <: Foo[A

在Scala 2.10.4中,它编译:

trait Foo[-U,T]{
  type Contra = U
}
但在2.11.0中,同样的问题在以下方面失败:

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

有解决办法吗?尝试将Scala库移植到2.11,需要使用逆变类型才能获得编译器获取的大量隐式def(即,使U不变量似乎不是一个选项)


谢谢

我无法想象会有什么工作可做。我之所以这么说是为了支持路径相关类型:

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

def foo[T显然是类型检查器中的post-2.7和pre-2.11。现在在OP中防止接近是一个功能,这是一件好事,有点像o_o

解决方法是按照2.11之前的方法进行,不同之处在于,现在你知道你是一个人了,而之前你认为编译器支持你

无知就是幸福,对吗

解决办法:

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

你能解释一下你是如何使用类型成员和逆变来控制隐式解析的吗?我很想听到更多关于这一点的信息,也许在这个问题的深层有一个解决方法。你能使用
类型逆变>:U
?@n.m.我不能使用逆变>:U,因为依赖于U的实例需要U而不是supertype of U(即,当尝试这种方法时,编译器突然说方法X不是Contra的成员)@wingedsubmariner U必须是Foo的逆变型参数,但在整个库中使用的隐式证据中,U是协变型。基本上,在Foo中,逆变型必须正好等于U,但在其他任何地方都被视为逆变型/协变型。2.11的quick&dirty是
@uncheckedVariance
,但您可以传递一些超类型U到扩展Foo的类,情况完全相同。示例+1确认了2.11中的更改。有关详细信息,请参阅我答案中的链接bug线程。