这段scala代码有什么问题?

时间:2016-03-16 08:36:18

标签: scala

我有以下无法编译的代码段:

val cids = List(1, 2, 3, 4)
val b = Map.newBuilder[Int, Int]
for (c <- cids) {
  b += (c, c*2)
}
b.result()

编译器报告

console>:11: error: type mismatch;
 found   : Int
 required: (Int, Int)
               b += (c, c*2)

我不知道这是什么错误。

5 个答案:

答案 0 :(得分:7)

这样可行:

for (c <- cids) {
   b += ((c, c*2))
}

括号被编译器解析为+=函数的参数列表括号,而不是元组。添加嵌套括号意味着将元组作为参数传递。 令人困惑......

答案 1 :(得分:5)

您可以通过以下方式修复它:

b += (c->c*2)

答案 2 :(得分:2)

这是一个重复的问题。

通常,提供一个未调整的arg列表如图所示,但是当方法重载时它不起作用,因为它会选择你不想要的方法,而不用费心去尝试自动化你的args。 / p>

scala> class C[A] { def f(a: A) = 42 }
defined class C

scala> val c = new C[(String, Int)]
c: C[(String, Int)] = C@3a022576

scala> c.f("1", 1)
res0: Int = 42

scala> class C[A] { def f(a: A) = 42 ; def f(a: A, b: A, rest: A*) = 17 }
defined class C

scala> val c = new C[(String, Int)]
c: C[(String, Int)] = C@f9cab00

scala> c.f("1", 1)
<console>:14: error: type mismatch;
 found   : String("1")
 required: (String, Int)
       c.f("1", 1)
           ^

答案 3 :(得分:2)

使用(不可变)值的方法,

(cids zip cids.map(_ * 2)).toMap

使用zip我们将每个值与其double配对,结果列表将转换为Map

答案 4 :(得分:0)

如果您转到文档,您会发现:this

支持的API为ms += (k -> v)。那就是你需要使用

for (c <- cids) {
  b += (c -> c*2)
}

或者,您可以使用上面建议的((c, c*2))语法。发生这种情况是因为编译器无法知道括号是否为元组。它只是将该参数理解为传递给+ =方法的两个参数。