【问题标题】:GWT 2.7: Return long from JSNI best PracticeGWT 2.7:从 JSNI 最佳实践中长返回
【发布时间】:2014-12-11 15:47:58
【问题描述】:

使用 GWT 2.7 我在 JavaScript 中存储和检索长值,如下代码所示:

private final native void setTime(Long time) /*-{
  return this.myLong;
}-*/;

private final native Long getTime() /*-{
  return this.myLong;
}-*/;

private void start() {
  Date date = new Date();
  long time = date.getTime();
  setTime(time);

  long time2 = getTime();
}

注意:我始终可以确保 JavaScript 部分中的长值不会更改,因为这些值只是在 JavaScript 的数据库中存储和检索。

这是在 JavaScript 中输入和输出长值的最佳方式吗?使用 double 值然后转换为 long 会更好吗?

【问题讨论】:

    标签: java javascript html gwt


    【解决方案1】:

    为了补充 Chri 的答案,JavaScript 实际上无法跟踪 long 的完整值!它可以跟踪的最精确数字相当于 Java double(64 位 IEEE 754 浮点),并且有一些合法值在转换为 double 并再次返回时不再是相同的数字!

    如果您只阅读属性并且您不在乎是否有足够的精度来实际存储它,那么不安全的长注释将起作用。如果可以,请使用 double,或者如果您想要一个 db ID 或其他任何不会改变您的东西,当您通过 JS 看起来很有趣时,请使用 String...

    【讨论】:

    • 所以你的意思是,当我需要精度时,我应该返回一个字符串并将其转换为 long?
    • String 不能转换为 long,您需要将 parse 转换为 long,但是是的,这可以工作。但是,如果您实际上并没有对这些值进行长时间的数学运算,只需将其保留为一个字符串 - 它会更快,并且可能是您首先需要的全部。
    【解决方案2】:

    如果您只是阅读该属性,那么这对您有用。

    @UnsafeNativeLong
    public final native long getValuePropertyLong(String key) /*-{
        return this.value[key];
    }-*/;
    

    在这里您可以找到更多信息 http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html

    Java long 类型不能在 JavaScript 中表示为数字 类型,因此 GWT 使用不透明的数据结构来模拟它。这表示 JSNI 方法不能处理 long 作为数字类型。这 因此,默认情况下,编译器不允许直接访问 long 来自 JSNI:JSNI 方法不能有 long 作为参数类型或 返回类型,并且它们无法使用 JSNI 引用访问 long。如果 你发现自己想要将 long 传入或传出 JSNI 方法, 这里有一些选项: 对于适合 double 类型的数字,请使用 double 类型而不是 long 类型。 对于需要完整长语义的计算,重新排列代码以便计算在 Java 中而不是在 JavaScript。这样他们将使用长仿真。 对于意在原封不动地传递给 Java 代码的值,将值包装在 Long 中。 JSNI 对 Long 类型没有限制 方法。 如果您确定自己知道自己在做什么,可以将注释 com.google.gwt.core.client.UnsafeNativeLong 添加到方法中。 然后编译器将允许您将 long 传入和传出 JavaScript。然而,它仍然是一个不透明的数据类型,所以唯一的 你可以用它做的事情就是将它传回给 Java。

    【讨论】:

      猜你喜欢
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 2011-04-12
      • 1970-01-01
      • 2014-06-16
      • 2015-09-01
      • 1970-01-01
      相关资源
      最近更新 更多