为什么所有scala vararg方法,当从java中使用时,似乎接受Seq变量,并且不能用作java本机vararg方法。这是一个错误吗?
例如,Buffer
有方法def append(elems: A*): Unit
。但在java中它有另一个签名:void append(Seq<A>)
。
答案 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))