可能的重复项:
将元组添加到集合不起作用
我有这个代码:
class A
var buffer = Buffer[(A, Int)]()
然后,在某个地方:
val a = new A
buffer += (a, 0) // error
类型推断器在a
(a, 0)
时失败,告诉我传递A
何时必须传递(A, Int)
:
scala> def make {
| val a = new A
| buffer += (a, 0)
| }
<console>:11: error: type mismatch;
found : A
required: (A, Int)
buffer += (a, 0)
^
但是,如果我这样做:
val a = new A
val tuple = (a, 0)
buffer += tuple
错误消失了。这是某种错误还是我错过了什么?
编译器不知道你在这里指的是缓冲区+=(a,0)还是缓冲区+= Tuple2(a,0)。
可能的解决方案:
buffer += Tuple2(a, 0)
buffer += Pair(a, 0) // Pair is an alias for Tuple2
buffer += ((a, 0))
buffer += a -> 0
可能编译器的信息有些误导。关键是buffer += (a, 0)
脱糖成buffer.+=(a, 0)
,正如你可以看到对双参数函数+=
的调用。你需要的是一个单参数函数,所以要解决你的问题,只需把你的元组放在额外的大括号里,就像这样:
buffer += ((a, 0))
或者使用糖红对语法,如下所示:
buffer += (a -> 0)
请记住,+= 只是最后的函数调用。函数"+="具有以下签名:
abstract def +=(elem: A): Buffer.this.type
因此,编译器将解释以下内容,就好像您将两个参数传递给"+="函数,而不是向其传递元组。
buffer += (a, 0) // error
解决方案是有一个嵌套的括号,从而向编译器明确表示您正在传递元组:
scala> buffer += ((new A(), 0))
res2: scala.collection.mutable.Buffer[(A, Int)] = ArrayBuffer((A@16fe464e,0), (A@6774c043,0))