Как создать Scala Seq[String]() из nashorn?

Мне нужно создать объект Seq() для подачи его в другой объект Scala из nashorn. Класс импортируется в nashorn через

var seqClass = Java.type("scala.collection.Seq");

и создание объекта выглядит так:

var seq = new seqClass();

Но при создании объекта для него я получаю TypeError:

TypeError: Can not create new object with constructor scala.collection.Seq with the passed arguments; they do not match any of its method signatures. in <eval> at line number 13

Я подозреваю, что общий класс для Seq() отсутствует, но я не могу понять, как добавить его в приведенный выше код.


person TeTeT    schedule 11.09.2015    source источник
comment
Не могли бы вы показать код, который вы используете для создания объектов?   -  person Zoltán    schedule 11.09.2015
comment
scala.collection.Seq — это просто псевдоним типа. Может быть, вам нужно использовать var seqClass = Java.type("scala.collection.immutable.Seq")?   -  person Sascha Kolberg    schedule 11.09.2015
comment
Я просто использовал var seq = new seqClass(); для создания объекта. Изменение его на неизменяемый Seq не меняет проблему.   -  person TeTeT    schedule 11.09.2015
comment
Разве Seq не абстрактны? Почему бы вам не попробовать вместо этого создать Vector или ::?   -  person Gábor Bakos    schedule 11.09.2015
comment
Отличное предложение, спасибо. Однако создание объекта завершается ошибкой с той же ошибкой TypeError.   -  person TeTeT    schedule 11.09.2015


Ответы (1)


У меня нет опыта работы с Nashorn, но Scala Seqs и другие коллекции создаются путем вызова сопутствующих методов вместо конструкторов. Насколько я понимаю, это должно быть что-то вроде

val seqCompanion = Java.type("scala.collection.immutable.Seq$").MODULE$
seqCompanion.empty() 

РЕДАКТИРОВАТЬ: я ожидал, что seqCompanion.apply(str1, str2, ...) будет работать для непустых последовательностей, но после проверки подпись JVM Seq$.apply равна public scala.collection.GenTraversable scala.collection.generic.GenericCompanion.apply(scala.collection.Seq), поэтому этого не произойдет. Вы можете сделать это, написав метод Scala, который принимает Array[A] и создает Seq[A] напрямую, и вызывая его, как указано выше:

// scala
object SeqToArray { def a2s[A](a: Array[A]) = a.toSeq }

// Nashorn
Java.type("SeqToArray$").MODULE$.a2s([str1, ...])
person Alexey Romanov    schedule 11.09.2015
comment
Большое спасибо! Пустой Seq() работает как шарм. Для функции преобразования в Nashorn необходимо создать массив Java вместо массива javascript, следуя stackoverflow.com/questions/22492641/ - person TeTeT; 12.09.2015
comment
@TeTeT Имеет смысл, я думал, что он будет преобразован автоматически, но Нэсхорн на самом деле не знает здесь ожидаемый тип. - person Alexey Romanov; 12.09.2015