2012-04-08 3 views
19

Существует множество статей по вызову Java varargs из кода Scala, но единственный вопрос, который я мог найти в обратном направлении, - это вопрос: Using scala vararg methods in java, который не имеет конкретных примеров.Как использовать Scala varargs из Java-кода

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

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

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

Что я пробовал:

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

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

- получить награду с NullPointerException.

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

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

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

ответ

24

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

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[].

+1

Я отредактировал ответ. – axel22

+0

Отлично, что работает. Оба по-прежнему показывают ошибки в Eclipse, но они действительно компилируются. Возможно, это было частью проблемы. –

Смежные вопросы