【问题标题】:Why is Integer.MIN_VALUE seen as a double by nashorn?为什么 Integer.MIN_VALUE 被 nashorn 视为双精度数?
【发布时间】:2017-06-07 13:34:42
【问题描述】:

我在一些只返回输入的 Javascript 中传递 Integer.MIN_VALUE。但是,似乎当我使用ScriptValueConverter.unwrapValue(returnedObject) 比较 Javascript 的结果时,值是相同的,但类型是双精度,而我期望的是整数。

但是,当我传入 Integer.MAX_VALUE 时,我确实得到了一个整数。

据我了解,Nashorn 使用乐观类型转换,所以在我看来,MIN_VALUE 仍然可以是 int,不需要它是 double

【问题讨论】:

  • 但是 Nashorn 不需要返回 Integer。也许它在一个点上分别存储值和签名,因此,不能在那里将Integer.MAX_VALUE 表示为int,也许下次更新会改变,谁知道呢?
  • 可能是错字,您的意思是 Integer.MIN_VALUE 吗?我知道它不需要返回一个整数,但这有点不寻常,不是吗,如果 Nashorn 使用乐观类型转换,MIN_VALUE 显然仍然可以表示为 int 但 Nashorn 选择使用 double,这与如何它处理 MAX_VALUE
  • 是的,我的意思是,Integer.MIN_VALUE 不能表示为“int 幅度和符号”。有时,试图处理这两种情况的代码会出现这样的问题。非直观的解决方案是在处理过程中将值表示为“大小和符号的否定”。不是每个人都这样做。

标签: java-8 nashorn


【解决方案1】:

我认为问题不在于 Nashorn 本身,而在于您正在运行的 javascript 代码或您正在使用的第三方转换器(ScriptValueConverter 既不是 javax.script 也不是 jdk.nashorn 类)。

我已经运行了以下代码:

    ScriptEngine jsEngine = new ScriptEngineManager().getEngineByName("nashorn");
    jsEngine.eval("function identity(x) {return x;}");
    System.out.println("Integer.MIN_VALUE:" + ((Invocable) jsEngine).invokeFunction("identity", Integer.MIN_VALUE).getClass());
    System.out.println("Integer.MAX_VALUE:" +((Invocable) jsEngine).invokeFunction("identity", Integer.MAX_VALUE).getClass());

输出是:

Integer.MIN_VALUE: class java.lang.Integer
Integer.MAX_VALUE: class java.lang.Integer

这里你可以找到关于nashorn type conversions的简要说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    相关资源
    最近更新 更多