我需要创建一个Seq()对象,以便将它从nashorn中的另一个Scala对象中提取出来。该课程通过
导入nashornvar 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()的泛型类,但我无法弄清楚如何将它添加到上面的代码中。
答案 0 :(得分:0)
我没有使用Nashorn的经验,但Scala Seq
和其他集合是通过调用伴随方法而不是构造函数创建的。鉴于我的理解,它应该像
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, ...])