如何从 nashorn 中创建 Scala Seq[String]()?

How to create a Scala Seq[String]() from within nashorn?

我需要创建一个 Seq() 对象,以便从 nashorn 中将其提供给另一个 Scala 对象。 class 通过

导入到 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() 的通用 class 丢失了,但我不知道如何将它添加到上面的代码中。

我没有使用 Nashorn 的经验,但是 Scala Seqs 和其他集合是通过调用伴随方法而不是构造函数来创建的。根据我的理解,应该是这样的

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

编辑:我希望 seqCompanion.apply(str1, str2, ...) 适用于非空序列,但在检查之后,Seq$.apply 的 JVM 签名是 public scala.collection.GenTraversable scala.collection.generic.GenericCompanion.apply(scala.collection.Seq) 所以它不会。您可以通过编写一个接受 Array[A] 并直接生成 Seq[A] 并像上面那样调用它的 Scala 方法来做到这一点:

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

// Nashorn
Java.type("SeqToArray$").MODULE$.a2s([str1, ...])