Scala обеспечивает @varargs
annotation, который генерирует Java списков параметров метода форвардер, что позволяет написать что-то вроде этого:Абстрактные методы и переменные аргументы аннотацию
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.
И, конечно, положить аннотацию только на bar
в Baz
означает, что мы не можем использовать для пересылки из Bar
экземпляра.
Кажется, что это ошибка, но это также кажется чрезвычайно простым в использовании, и я не вижу ничего в трекер-проблеме. Я правильно использую @varargs
? Если это так, есть ли обходной путь, который заставит его делать то, что вы ожидаете здесь?
Oops. Кажется мне еще одна ошибка.Благодаря друг другу решение 'jugaad' для взаимодействия. Гоша! сколько еще там лежит? – Jatin
Похоже на ошибку. Попробуйте представить новую ошибку для своего трекера. – Luminous