我有以下无法编译的代码段:
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)
我不知道这是什么错误。
答案 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))
语法。发生这种情况是因为编译器无法知道括号是否为元组。它只是将该参数理解为传递给+ =方法的两个参数。