在java中使用scala vararg方法

时间:2011-11-29 10:47:22

标签: scala scala-collections scala-java-interop

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

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

3 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:-6)

您可以使用Seq轻松地在varargs中投射:_*。例如:

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

这样可以避免集合API中的代码重复。

您也可以使用appendAll

b.appendAll((List(1, 2))