2014-09-08 5 views
3

У меня есть класс Scala, конструктор которого принимает список параметров переменной длины.Синтаксис для вызова параметра переменной длины Функция Scala из Java?

case class ItemChain(items: Item*) 

От Scala это можно назвать как так

ItemChain(Item(), Item()) 

Я не могу понять, синтаксис для вызова из Java. Если я делаю это

new ItemChain(new Item(), new Item()) 

Я получаю ошибку компилятора, что говорит эта строка не совпадает с подписью scala.collection.seq<Item>.

Я могу непосредственно создать экземпляр объекта последовательности Scala из Java.

new scala.collection.Seq<Item>() 

Но я не могу понять, как впоследствии добавить свои два Item экземпляра к нему. Если я создаю Java List из Item и передам его scala.collection.Seq Я получаю ошибку времени выполнения.

+0

Я не знаком с Scala, но это звучит как Scala использует его собственный класс для аргументов Маршалла в функции переменной длиной. Это отличается от Java, который передает их как массив. – Powerlord

+1

Похоже, самый простой способ получить Seq от Java является использование [JavaConversions] [1] [1]: http://stackoverflow.com/questions/6784593/how-to-create- a-scala-collection-immutable-seq-from-a-java-list-in-java – DPM

+1

'@ scala.annotation.varargs' обычно может помочь в подобных ситуациях, но не для конструкторов и, по-видимому, не для' ItemChain. apply', хотя вы не получите сообщение об ошибке, если вы положите его из определения класса case (что для меня немного удивительно). Положите его на метод 'create' в сопутствующем объекте, и вам должно быть хорошо идти. –

ответ

4

Это должен сделать трюк:

import static scala.collection.JavaConverters.asScalaBufferConverter; 
import static java.util.Arrays.asList; 

... 

new ItemChain(asScalaBufferConverter(asList(new Item(), new Item())).asScala()); 
Смежные вопросы