Как использовать 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, но это было бы слишком легко.
Ответы
Ответ 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[]
.