Scala - 元组类型推断失败?

3

我有以下代码:

可能是重复问题:
将元组添加到集合中不起作用

class A

var buffer = Buffer[(A, Int)]()

然后,在某个地方:

val a = new A
buffer += (a, 0) // error

类型推断器在 (a, 0) 中的 a 失败,告诉我要传递 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

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

这里不是一个集合,但问题完全相同。 - Nicolas
3个回答

7

编译器不知道你在这里是想要使用 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

选择这个答案是因为它提供了最多的选项,特别是指定PairTuple2选项,这对参考非常有益。 - noncom

3

可能编译器的信息有些误导性。重点是buffer += (a, 0)被转换为buffer.+=(a, 0),正如您所看到的是对一个两个参数函数+=的调用。您需要的是一个单参数函数,因此要解决您的问题,只需将元组放在额外的括号中即可:

 buffer += ((a, 0))

或者使用糖衣语法如下:
 buffer += (a -> 0)

1

请记住,+= 只是一个函数调用。函数 "+=" 的签名如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接