如何将Scala Seq传递给Java varargs

时间:2013-06-14 19:30:19

标签: java scala variadic-functions

我有一个像这样的现有Java方法:

public static MyJavaClass javaFunc(String name, long... values) {
    ...
}

我需要从Scala中调用它:

val idList: Seq[Long] = Seq(1L, 2L, 3L)

MyJavaClass.javaFunc("hello", idList)

但最终会在idList参数上调用toString方法。我试过以下无济于事:

MyJavaClass.javaFunc("hello", idList:_*)

导致编译错误:

no `: _*' annotation allowed here (such annotations are only allowed in arguments to *-parameters)

我如何传递参数?

3 个答案:

答案 0 :(得分:1)

这就是诀窍:

import scala.collection.JavaConverters._
val javaList = idList.asJava

答案 1 :(得分:1)

// java class
public class MyJavaClass {
    public static void javaFunc(String name, long ...values) {
        for (long i: values)
            System.out.print(i + " ");
        System.out.println();
    }
}
//scala class
object Y {
  def main(args: Array[String]): Unit = {
    val idList: Seq[Long] = Seq(1L, 2L, 3L)
    MyJavaClass.javaFunc("hello", idList: _*)
  }
}

它对我来说就是这样

答案 2 :(得分:0)

我无法在Scala 2.10.4和Java 8上重现它,但似乎是一个错误。

您可以通过添加以下Java方法来避免使用: _*

public static MyJavaClass javaFuncConverter(String name, long[] values) {
     return javaFunc(name, values);
}

public static MyJavaClass javaFuncConverter(String name, long value) {
     return javaFunc(name, value);
}

在您的Scala代码中,您可以这样称呼它:

val idList: Seq[Long] = Seq(1L, 2L, 3L)

MyJavaClass.javaFuncConverter("hello", idList.toArray)
MyJavaClass.javaFuncConverter("hello", idList.head)