我收到一条错误消息"错误:类型参数[Any]不符合trait Cloneable的类型参数bounds [+ A <:AnyRef],"我无法做出正面或反面.
特别,
var M = mutable.Map[Int, mutable.Set[Int]]()
for(i <- 1 to 100; j <- 1 to 100) {
if(!M.contains(i)) {M += i -> mutable.Set[Int](j)}
else {M(i) += j}
}
Run Code Online (Sandbox Code Playgroud)
(我实际上正在尝试更复杂的东西,但这是生成代码的错误,并将其简化为最小化)
并且上面代码的最后一行生成错误消息.如果我进一步剥离它
for(i <- 1 to 100; j <- 1 to 100) {
if(!M.contains(i)) {M += i -> mutable.Set[Int](j)}
}
Run Code Online (Sandbox Code Playgroud)
有用!
如何使上述代码有效?
Digal诊断出问题(无法统一if-else分支的类型),它看起来像编译器错误.这是一个进一步的简化案例,在编译时间过长后会在REPL中出现错误,
if (true) {
null: collection.mutable.Map[Int, Int]
} else {
null: collection.mutable.Set[Int]
}
Run Code Online (Sandbox Code Playgroud)
在此期间,您可以使用if-else语句中的某个显式类型编译代码进行编译,
for(i <- 1 to 100; j <- 1 to 100) {
if(!M.contains(i)) {M += i -> mutable.Set[Int](j)}
else {M(i) += j}: Unit
}
Run Code Online (Sandbox Code Playgroud)
我在这里提出了一个问题:https://issues.scala-lang.org/browse/SI-4938
我进一步减少了你的例子:
scala> if(!M.contains(1)) {M += 1 -> mutable.Set[Int](1)} else {M(1) += 1};
<console>:9: error: type arguments [Any] do not conform to trait Cloneable's type parameter bounds [+A <: AnyRef]
val res17 =
^
Run Code Online (Sandbox Code Playgroud)
当编译器试图为两个分支找到公共返回类型时,似乎会出现问题:第一个是
scala> M += 1 -> mutable.Set[Int](1)
res19: scala.collection.mutable.Map[Int,scala.collection.mutable.Set[Int]] = ...
Run Code Online (Sandbox Code Playgroud)
而"其他"部分是
scala> M(1) += 1
res18: scala.collection.mutable.Set[Int] = Set(1)
Run Code Online (Sandbox Code Playgroud)
如果我在此表达式的末尾添加一个返回值,REPL会毫无错误地使用它:
scala> if(!M.contains(1)) {M += 1 -> mutable.Set[Int](1)} else {M(1) += 1}; println("hello")
hello
Run Code Online (Sandbox Code Playgroud)
因为表达式的返回类型是Unit.
| 归档时间: |
|
| 查看次数: |
1040 次 |
| 最近记录: |