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

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

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

<code>def readLine (text: String, args: Any*): String
</code>

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

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

1) Использование нуля

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

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

2) Заменаnull сscala.collection.Seq.empty(), но Javac сообщает о всевозможных ошибках, таких какSeq не имеяempty метод.

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

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

Ответы на вопрос(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[].

 08 апр. 2012 г., 14:09
Я отредактировал ответ.
 Luigi Plinge08 апр. 2012 г., 14:30
Отлично, это работает. Оба по-прежнему показывают ошибки в Eclipse, но на самом деле они компилируются. Это могло быть частью проблемы.

Ваш ответ на вопрос