在for循环和条件语句中添加scala映射

时间:2011-08-23 00:23:14

标签: scala

我收到错误消息“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)}
}

它有效!

如何使上述代码有效?

2 个答案:

答案 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。