首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理不透明类型(Char和Long)

处理不透明类型(Char和Long)
EN

Stack Overflow用户
提问于 2015-01-07 14:38:48
回答 1查看 735关注 0票数 6

我正在尝试导出算法的Scala实现,以便在JavaScript中使用。我在用@JSExport。该算法适用于在Char中标记为不透明的Scala、Long互操作性指南值。

我想知道(a)这意味着什么;(b)处理这一问题的建议是什么。

我认为这意味着我应该避免使用CharLong,而应该使用String和运行时检查长度(或者可能使用不成形的Sized集合)和Int

但是其他的想法是欢迎的。

更多细节..。

我看到的代码是:

代码语言:javascript
复制
@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的方法类似的方法)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-07 16:02:37

不透明意味着

  • 没有对应的JavaScript类型。
  • 无法从JavaScript创建该类型的值(除非存在@JSExported构造函数)
  • 无法操作该类型的值(除了调用@JSExported方法和字段外)

仍然可以从Scala.js代码接收该类型的值,传递它,并将其返回给Scala.js代码。也总是可以调用.toString(),因为java.lang.Object.toString()@JSExport编辑的。除了toString()之外,CharLong都不能导出任何东西,所以您不能使用它们做任何其他事情。

因此,正如您所经历的,JavaScript 1不能用作Scala.js Long,因为它不是正确的类型。'a'也不是一个有效的Char (但它是一个有效的String)。

因此,正如您自己推断的那样,您必须确实避免不透明类型,如果需要从JavaScript创建/操作它们,则必须使用其他类型。Scala.js端可以使用语言中的标准工具(如someChar.toIntsomeInt.toChar )来回转换。

哪种类型的选择最好取决于您的应用程序。对于Char来说,可能是IntString。对于Long,它可以是String,一对Int,甚至可能是Double,如果可能的值从未使用超过52位的精度。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27821841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档