为什么所有 scala vararg 方法,当从 java 中使用时,似乎都接受变量的 Seq,并且不能用作 java 本机 vararg 方法。这是一个错误吗?
例如,Buffer
有方法def append(elems: A*): Unit
。但在 java 中它有另一个签名:void append(Seq<A>)
.
为什么所有 scala vararg 方法,当从 java 中使用时,似乎都接受变量的 Seq,并且不能用作 java 本机 vararg 方法。这是一个错误吗?
例如,Buffer
有方法def append(elems: A*): Unit
。但在 java 中它有另一个签名:void append(Seq<A>)
.
如果您控制 scala 代码,您可以使用 @varargs 使其生成与 java 兼容的 varags 方法,例如@varargs def append(elems: A*): Unit = {}
这不是一个错误。这是一种设计选择,它有利于在 Scala 中使用 vararg,而不是与 Java 的互操作性。例如,它允许您将 a 传递给List
Scala 可变参数方法,而无需Array
在途中将其转换为 an。
如果你需要使用 Java 中的 Scala 可变参数,你应该创建一些 scala Seq。例如,您可以编写一个 Java 包装器来获取自动创建的数组,然后使用对象中的genericWrapArray
方法Predef
。
您可以Seq
使用:_*
. 例如 :
val b = collection.mutable.ListBuffer.empty[Int]
b.append(List(1, 2):_*)
所以这避免了集合 API 中的代码重复。
您也可以简单地使用appendAll
:
b.appendAll((List(1, 2))