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