使用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还是从JavaScript中放入值的最佳方法?使用double值然后转换为long会更好吗?
答案 0 :(得分:3)
如果您只是阅读该物业,那么这将适合您。
@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 来自JSNI:JSNI方法不能长期作为参数类型或 返回类型,并且他们无法使用JSNI引用访问long。如果 你发现自己想要传入或传出一个JSNI方法, 这里有一些选择: 对于适合double类型的数字,请使用double类型而不是long类型。 对于需要完整长语义的计算,重新排列代码,以便计算发生在Java而不是 JavaScript的。这样他们就会使用长期仿真。 对于要通过未更改的值传递给Java代码的值,请将值包装在Long中。 JSNI对Long类型没有限制 方法。 如果您确定知道自己在做什么,可以将com.google.gwt.core.client.UnsafeNativeLong注释添加到方法中。 然后编译器将允许您传入和传出一个长的 JavaScript的。但它仍然是一种不透明的数据类型,所以它是唯一的 你可以用它做的事情就是将它传递给Java。
答案 1 :(得分:3)
为了补充Chri的答案,JavaScript实际上无法追踪long
的全部价值!它可以跟踪的最精确数字相当于Java double
(64位IEEE 754浮点数),并且有一些合法值,当转换为double
并再次返回时,不再是相同的数字!
如果您只是阅读和属性,那么如果您有足够的精确度来实际存储它,那么不安全的长注释将起作用。如果你愿意,可以使用double,或者如果你想要一个db ID,或者当你通过JS看到它时有什么不改变你的话,请使用String ...