java - 如何声明 scala 方法以便可以使用可变参数样式从 Java 调用它

标签 java scala interop variadic-functions

我在 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/

相关文章:

scala - 什么时候使用来自 scalaz 的 monad?

c# - 如何在 C# 中模拟 java 上的对象序列化

c# - 32 位与 64 位版本类型的条件编译的首选方法

java - Spring Boot - 需要哪些注解

java - Java HTTP 服务器错误 : Unexpected end of file from server

java - 如何将新条目添加到现有 XML 文件(DOM 除外)

interop - FHIR 互操作平台选择

java - Android/Java 网络IO慢

java - 从 T 到 T 的 map

hibernate - 如何从 Play 2.0 中排除 Bean?