如何声明scala方法,以便可以使用varargs样式从Java调用它

oxb*_*kes 9 java interop scala variadic-functions

我在scala库类中有两个简单的方法:

class Foo {
  def bar(args : String*) : Unit = println("Foo.bar with: " + args)
  def bar(args : Array[String]) : Unit = bar(args.toSeq : _*)
}
Run Code Online (Sandbox Code Playgroud)

这一切都编译得很好.然后我把它放在一个库中foo.jar并尝试编译以下Java:

import Foo
public class Test {

    public static void main(String[] args) {
        Foo foo = new Foo();
        foo.bar("Hello", "World"); //DOES NOT COMPILE
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以用以下内容替换违规行:

foo.bar(new String[] { "Hello", "World" }); //OK
Run Code Online (Sandbox Code Playgroud)

但这似乎打败了这一点.如何使用类似Java varargs的语法从Java调用它?

Set*_*sue 3

在 2.8(不知道 2.7)中,如果您从 Java 父级重写 varargs 方法,或者从 Java 接口实现 varargs 方法,那么 Scala 编译器将生成两种方法,一种用于 Scala,一种用于 Java。Java 的——正如您通过检查字节码 \xe2\x80\x94 所看到的那样,只是采用 varargs 数组并将其包装,然后将 WrappedArray 传递给需要 Seq 的 Scala 版本。

\n\n

如果有办法强制编译器在其他情况下生成转发器,我不知道。我怀疑它是否存在。似乎提供一种请求它的方法(我猜是一个注释)将是一个合理的增强请求。

\n