抽象方法和 varargs 注释
2022-09-04 23:21:21
Scala提供了一个@varargs
注释,该注释生成了一个Java varargs转发器方法,这使得编写如下内容成为可能:
import scala.annotation.varargs
class Foo {
@varargs def foo(args: String*): Unit = {
args.foreach(println)
}
}
然后从Java调用此方法,而无需创建:scala.Seq
Foo foo = new Foo();
foo.foo("a", "b");
这很好。
不幸的是,当该方法是抽象的时,转发部分似乎没有发生:
trait Bar {
@varargs def bar(args: String*): Unit
}
class Baz extends Bar {
def bar(args: String*): Unit = {
args.foreach(println)
}
}
现在,如果我们有这个Java代码:
Bar bar = new Baz();
bar.bar("a", "b");
我们得到这个异常(在运行时):
java.lang.AbstractMethodError: Baz.bar([Ljava/lang/String;)V
我们可以通过以下方式确认问题:javap
public interface Bar {
public abstract void bar(java.lang.String...);
public abstract void bar(scala.collection.Seq<java.lang.String>);
}
public class Baz implements Bar {
public void bar(scala.collection.Seq<java.lang.String>);
public Baz();
}
所以不,转发器肯定没有实现。
将注释放在这两个方法上都无法编译:bar
A method with a varargs annotation produces a forwarder method with the same
signature (args: Array[String])Unit as an existing method.
当然,仅将注释放在 in 上意味着我们不能从实例中使用转发器。bar
Baz
Bar
这似乎一定是一个错误,但它似乎也非常容易遇到,我在问题跟踪器中没有看到任何东西。我是否正确使用?如果是这样,是否有解决方法可以使其达到您在此处的期望?@varargs