Scala - 元组类型推理失败



可能的重复项:
将元组添加到集合不起作用

我有这个代码:

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

最新更新