我收到错误消息“error:type arguments [Any]不符合trait Cloneable的类型参数bounds [+ A&lt ;: AnyRef],”我无法做出正面或反面。< / p>
具体地,
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}
}
(我实际上是在尝试更复杂的东西,但这是生成代码的错误,并将其简化为最小化)
上面代码的最后一行生成错误消息。如果我进一步剥离它
for(i <- 1 to 100; j <- 1 to 100) {
if(!M.contains(i)) {M += i -> mutable.Set[Int](j)}
}
它有效!
如何使上述代码有效?
答案 0 :(得分:7)
Digal诊断出问题(无法统一if-else分支的类型),它看起来像编译器错误。这是一个进一步的简化案例,在编译时间很长之后会在REPL中产生错误
if (true) {
null: collection.mutable.Map[Int, Int]
} else {
null: collection.mutable.Set[Int]
}
与此同时,您可以使用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
}
我在这里提出了一个问题:https://issues.scala-lang.org/browse/SI-4938
答案 1 :(得分:6)
我进一步减少了你的榜样:
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 =
^
当编译器尝试为两个分支找到公共返回类型时,似乎会出现问题: 第一个是
scala> M += 1 -> mutable.Set[Int](1)
res19: scala.collection.mutable.Map[Int,scala.collection.mutable.Set[Int]] = ...
而“其他”部分是
scala> M(1) += 1
res18: scala.collection.mutable.Set[Int] = Set(1)
如果我在此表达式的末尾添加一个返回值,则REPL会毫无错误地使用它:
scala> if(!M.contains(1)) {M += 1 -> mutable.Set[Int](1)} else {M(1) += 1}; println("hello")
hello
因为表达式的返回类型是Unit。