我试图反序列化一个json api,它将时间戳作为长类型发送。我的叠加层看起来像这样:
public class OverlayTest extends JavaScriptObject {
public final native Long getTimestamp() /*-{ return this.timestamp; }-*/;
}
这似乎有用 - 当我使用getter打印到控制台时,我得到了长值。我现在尝试将其传递到Date实例中进行格式化:
OverlayTest item = ...;
Date date = new Date(item.getTimestamp());
// or
Date date = new Date(item.getTimestamp().longValue());
但是我得到了一个TypeError异常:
longValue__J is not a function
输出堆栈跟踪有点严重,因为在我的情况下GWT输出已经编译为javascript。我知道GWT在某种程度上模仿Long支持,因为javascript无法直接执行 - 是否有一些解决方法,或者这是不可能的?
由于
答案 0 :(得分:3)
类型java.lang.Long
(或long
)在GWT中被模拟,因为JS无法正确处理这种类型 - JS中的所有数字都是有效的Java双精度数,只有大约54位的精度,而a long
/ Long
需要64位。如果GWT允许您将数字输入和输出JS作为长数,那么您将失去精确度。
在您的GWT代码中,包含三个数字的对象用于正确表示长整数。任何希望看到数字的JS代码都会非常惊讶地看到该对象,并且Java代码会看到一个数字而不是那个包装器对象会感到惊讶。
相反,要么将double
和int
传入和传出JSNI。在通过millis约会的情况下,int
将工作到2038年左右。也许届时我们的浏览器中会有相当大的数字。
即使你的JS代码中有一个很长的数字,它也会被默默地截断,以便它适合JS正确表示的内容,所以你不会丢失任何东西。如果你可以将数据保持在long
整个时间会更好,但如果数字通过JS(除了作为字符串),精度将会丢失,数字足够大。但是,如果您的数字不会变得那么大,double
或int
就足够了。
(我不知道为什么它似乎正常工作 - 猜测模拟对象有一个很好的toString
,但没有具体说明你如何工作'工作&# 39;我无法确定发生了什么。)