我正在尝试导出算法的Scala实现,以便在JavaScript中使用。我在用@JSExport。该算法适用于在Char中标记为不透明的Scala、Long和互操作性指南值。
我想知道(a)这意味着什么;(b)处理这一问题的建议是什么。
我认为这意味着我应该避免使用Char和Long,而应该使用String和运行时检查长度(或者可能使用不成形的Sized集合)和Int。
但是其他的想法是欢迎的。
更多细节..。
我看到的代码是:
@JSExport("Foo")
class Foo(val x: Int) {
@JSExport("add")
def add(n: Int): Int = x+n
}...which就像预期的那样工作:new Foo(1).add(2)生成3。
用Long替换这些类型,使用相同的调用报告:java.lang.ClassCastException: 1 is not an instance of scala.scalajs.runtime.RuntimeLong (以及与获取和返回Char的方法类似的方法)。
发布于 2015-01-07 16:02:37
不透明意味着
@JSExported构造函数)@JSExported方法和字段外)仍然可以从Scala.js代码接收该类型的值,传递它,并将其返回给Scala.js代码。也总是可以调用.toString(),因为java.lang.Object.toString()是@JSExport编辑的。除了toString()之外,Char和Long都不能导出任何东西,所以您不能使用它们做任何其他事情。
因此,正如您所经历的,JavaScript 1不能用作Scala.js Long,因为它不是正确的类型。'a'也不是一个有效的Char (但它是一个有效的String)。
因此,正如您自己推断的那样,您必须确实避免不透明类型,如果需要从JavaScript创建/操作它们,则必须使用其他类型。Scala.js端可以使用语言中的标准工具(如someChar.toInt和someInt.toChar )来回转换。
哪种类型的选择最好取决于您的应用程序。对于Char来说,可能是Int或String。对于Long,它可以是String,一对Int,甚至可能是Double,如果可能的值从未使用超过52位的精度。
https://stackoverflow.com/questions/27821841
复制相似问题