У меня есть 2 простых метода в scala классе библиотеки:
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 с помощью Java подобный varargs синтаксис?
В 2.8 (не знаю, как в 2.7), если вы переопределяете метод varargs из родительского метода Java или реализуете метод varargs из интерфейса Java, то компилятор Scala генерирует два метода, один для Scala, другой для Java. Java-метод - как вы можете убедиться сами, просмотрев байткод - просто берет массив varargs и оборачивает его, затем передает WrappedArray в версию Scala, которая ожидает Seq.
Если есть способ заставить компилятор генерировать форвардер при других обстоятельствах, я о нем не знаю. Я сомневаюсь, что он существует. Кажется, что предоставление способа попросить об этом (аннотация, я полагаю) было бы разумным запросом на улучшение.
Не совсем уверен, но я думаю, что varargs в Scala использует последовательности и отличается от реализации java. Я думаю, что самый простой способ выполнить то, что вы хотите, - создать подкласс класса Scala Foo в Java и добавить метод bar, который принимает Java vararg, т.е.
public class JavaFoo extends Foo {
public void bar(String... args) {
super.bar(args)
}
}
Затем метод JavaFoo vararg может быть вызван с использованием синтаксиса vararg в Java.
Надеюсь, это поможет :)