Как объявить scala метод так, чтобы это можно было назвать от Java с помощью varargs стиль

У меня есть 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 синтаксис?

9
задан oxbow_lakes 22 June 2010 в 03:19
поделиться

2 ответа

В 2.8 (не знаю, как в 2.7), если вы переопределяете метод varargs из родительского метода Java или реализуете метод varargs из интерфейса Java, то компилятор Scala генерирует два метода, один для Scala, другой для Java. Java-метод - как вы можете убедиться сами, просмотрев байткод - просто берет массив varargs и оборачивает его, затем передает WrappedArray в версию Scala, которая ожидает Seq.

Если есть способ заставить компилятор генерировать форвардер при других обстоятельствах, я о нем не знаю. Я сомневаюсь, что он существует. Кажется, что предоставление способа попросить об этом (аннотация, я полагаю) было бы разумным запросом на улучшение.

3
ответ дан 3 November 2019 в 07:12
поделиться

Не совсем уверен, но я думаю, что 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.

Надеюсь, это поможет :)

1
ответ дан 3 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: