来自 API 的 GWT Long 类型用于日期解析?

GWT Long type from API for Date parsing?

我正在尝试反序列化一个 json api,它将时间戳作为 long 类型发送。我的覆盖图如下所示:

public class OverlayTest extends JavaScriptObject {
    public final native Long getTimestamp() /*-{ return this.timestamp; }-*/;
}

这似乎有效 - 当我使用 getter 打印到控制台时,我得到了 long 值。我正在尝试将其传递到 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 不能直接这样做 - 是否有一些解决方法,或者这是不可能的?

谢谢

类型 java.lang.Long(或 long)在 GWT 中被模拟,因为 JS 无法正确处理这种类型 - JS 中的所有数字实际上都是 Java 双精度数,只有大约 54位精度,而 long/Long 需要 64 位。如果 GWT 允许您将数字传入和传出 JS,那么您将失去精度。

在您的 GWT 代码中,一个包含三个数字的对象用于正确表示一个 long。任何希望看到数字的 JS 代码都会对看到该对象感到非常惊讶,并且 Java 代码会对看到数字而不是包装对象感到惊讶。

因此,要么将 doubles 和 ints 传入和传出 JSNI。在日期传递毫秒的情况下,int 将在 2038 年左右之前正常工作。也许到那时我们的浏览器中会有合理大小的数字。

即使您的 JS 代码中有一个非常长的数字,它也会被静默截断以使其适合 JS 可以正确表示的内容,因此您不会丢失任何内容。如果你能把数据一直保存在 long 中会更好,但是如果数字通过 JS(而不是作为字符串),那么数字足够大就会丢失精度。但当然,如果您的数字不会变得那么大,doubleint 就足够了。

(我不知道为什么它看起来工作正常 - 猜测是模拟对象有一个很好的 toString,但没有具体说明你是如何得到它的 'work',我不确定发生了什么。)