我在 Scala 库类中有 2 个简单的方法:
class Foo {
def bar(args : String*) : Unit = println("Foo.bar with: " + args)
def bar(args : Array[String]) : Unit = bar(args.toSeq : _*)
}
这一切都很好地编译。然后我将其放入库 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
}
}
我可以将有问题的行替换为:
foo.bar(new String[] { "Hello", "World" }); //OK
但这似乎违背了重点。我如何使用类似 Java varargs 的语法从 Java 中调用它?
最佳答案
在 2.8(不知道 2.7)中,如果你从 Java 父类覆盖一个可变参数方法,或者从 Java 接口(interface)实现一个可变参数方法,那么 Scala 编译器将生成两种方法,一种用于 Scala,一种用于 Java。 Java 版本——正如您可以通过检查字节码自己看到的那样——简单地获取可变参数数组并将其包装,然后将 WrappedArray 传递给需要 Seq 的 Scala 版本。
如果有办法强制编译器在其他情况下生成转发器,我不知道。我怀疑它是否存在。似乎提供一种请求它的方式(我猜是注释)将是一个合理的增强请求。
关于java - 如何声明 scala 方法以便可以使用可变参数样式从 Java 调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3093881/