10

为什么所有 scala vararg 方法,当从 java 中使用时,似乎都接受变量的 Seq,并且不能用作 java 本机 vararg 方法。这是一个错误吗?

例如,Buffer有方法def append(elems: A*): Unit。但在 java 中它有另一个签名:void append(Seq<A>).

4

3 回答 3

17

如果您控制 scala 代码,您可以使用 @varargs 使其生成与 java 兼容的 varags 方法,例如@varargs def append(elems: A*): Unit = {}

于 2012-10-31T15:02:18.570 回答
8

这不是一个错误。这是一种设计选择,它有利于在 Scala 中使用 vararg,而不是与 Java 的互操作性。例如,它允许您将 a 传递给ListScala 可变参数方法,而无需Array在途中将其转换为 an。

如果你需要使用 Java 中的 Scala 可变参数,你应该创建一些 scala Seq。例如,您可以编写一个 Java 包装器来获取自动创建的数组,然后使用对象中的genericWrapArray方法Predef

于 2011-11-29T15:07:27.890 回答
-6

您可以Seq使用:_*. 例如 :

val b = collection.mutable.ListBuffer.empty[Int]
b.append(List(1, 2):_*)

所以这避免了集合 API 中的代码重复。

您也可以简单地使用appendAll

b.appendAll((List(1, 2))
于 2011-11-29T10:54:57.117 回答