有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何将Scala Seq传递给Java varargs

我有一个现有的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) 个答案

  1. # 1 楼答案

    我无法在Scala2.10.4和Java8上重现这一点,但它似乎是一个bug

    通过添加以下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)
    
  2. # 2 楼答案

    // 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: _*)
      }
    }
    

    对我来说就是这样

  3. # 3 楼答案

    这就成功了:

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