Подтвердить что ты не робот

Как использовать Scala varargs из Java-кода

Есть много статей по вызову Java varargs из Scala кода, но единственное, что я мог найти в обратном направлении, это вопрос: Использование Scala методов vararg в java, в которой нет конкретных примеров.

Я пытаюсь использовать scala.Console из некоторого кода Java по той причине, что java.io.Console не работает в Eclipse, тогда как Scala. Но я не могу получить метод

def readLine (text: String, args: Any*): String

потому что он, кажется, ожидает scala.collection.Seq[Any] для второго аргумента, и я не вижу, как создать Seq в Java. Как я могу обойти это?

Вещи, которые я пробовал:

1) Используя null

// Java
String s = scala.Console.readLine("Enter text: ", null);

- получите вознаграждение NullPointerException.

2) Замена null на scala.collection.Seq.empty(), но javac сообщает о всех видах ошибок, таких как Seq, не имеющих метода empty.

3) Использование объекта Nil в объекте пакета scala.collection.immutable, но синтаксис, предложенный здесь, который будет scala.collection.immutable.package$Nil$.MODULE$, но это может" t будет разрешено.

Конечно, я мог бы просто использовать метод readLine(), который не принимает varargs, но это было бы слишком легко.

4b9b3361

Ответ 1

Вы можете использовать:

scala.collection.Seq$.MODULE$.empty();

из Java-кода, чтобы создать пустую последовательность. В противном случае вы можете использовать:

new scala.collection.mutable.ArrayBuffer();

чтобы создать пустой буфер массива, в который вы можете добавить элементы и использовать его в качестве аргумента для методов Scala vararg.

В противном случае, если вы создадите библиотеку Scala с методами vararg, которые вы хотите использовать из кода Java, используйте аннотацию varargs. Он будет генерировать Java-версию метода, который принимает массив вместо Seq.

scala> class A {
     |   @annotation.varargs def foo(x: Int*) { println(x) }
     | }
defined class A

scala> println(classOf[A].getMethods.toList)
List(public void $line1.$read$$iw$$iw$A.foo(scala.collection.Seq), public void $line1.$read$$iw$$iw$A.foo(int[]), ...)

Выше показано, что существует 2 версии метода foo, сгенерированных - один, который принимает Seq[Int], а другой - принимает int[].