Scala-tuple类型推断失败?

Scala-tuple类型推断失败?,scala,tuples,type-inference,Scala,Tuples,Type Inference,可能重复: 我有以下代码: class A var buffer = Buffer[(A, Int)]() 然后,在某个地方: val a = new A buffer += (a, 0) // error 当我必须通过(a,Int)时,类型推断器在(a,0)中的a上失败,告诉我通过a: 错误消失了。这是某种错误还是我遗漏了什么?编译器不知道,这里的意思是buffer.+=(a,0)还是buffer+=Tuple2(a,0) 可能的解决办法: buffer += Tuple2(a, 0)

可能重复:

我有以下代码:

class A

var buffer = Buffer[(A, Int)]()
然后,在某个地方:

val a = new A
buffer += (a, 0) // error
当我必须通过
(a,Int)
时,类型推断器在
(a,0)
中的
a
上失败,告诉我通过
a


错误消失了。这是某种错误还是我遗漏了什么?

编译器不知道,这里的意思是buffer.+=(a,0)还是buffer+=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))
或者使用如下的sugarred pair语法:

 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))

这里不是一个集合,但问题是完全相同的。选择此答案的选项种类最多,即指定
Pair
Tuple2
选项,这有利于参考。
buffer += (a, 0) // error
scala> buffer += ((new A(), 0))
res2: scala.collection.mutable.Buffer[(A, Int)] = ArrayBuffer((A@16fe464e,0), (A@6774c043,0))