处理学校的组项目,当我在命令行中运行javac时,以下行会引发错误。
Object result = engine.eval(equation); //evaluate the arithmetic expression
cellValue = (double) result; // <-- This throws a compiler error (obviously)
但出于某种原因,这在eclipse中编译和工作(!),我的同学正在使用它。我试着让自己确认,因为我无法相信。
ScriptEngine engine = manager.getEngineByName("JavaScript");
引擎是一个ScriptEngine,如果它是相关的。我不能为我的生活弄清楚eclipse的编译器如何允许编译一行直接将Object
强制转换为double
。
答案 0 :(得分:6)
可能你的朋友正在使用其他版本的Java语言。 {7}到Object
(原始类型)的强制转换似乎在Java 7中是合法的,但在Java 6中则不合法。您可以让您的朋友在Eclipse中更改其项目设置或将编译器更新为版本7。
请注意,将double
投射到Object
(该类)适用于两个版本。
答案 1 :(得分:5)
似乎允许的转换已在Java 5和7之间进行了扩展。在Java Language Specification, 3rd edition (for Java 5 and 6):
中引用类型的值可以通过拆箱转换(第5.1.8节)转换为基本类型。
取消装箱转换会将引用类型的值转换为基本类型的相应值。具体来说,以下8次转换称为拆箱转换:
- 从类型Boolean到类型boolean
- 从类型字节到类型字节
- 从类型字符到类型字符
- 从短类型到短类型
- 从类型Integer到类型int
- 从类型Long到类型长
- 从类型Float到类型float
- 从类型Double到类型double
因此,在Java 5和6中,将Object
投射到double
是不合法的。
Java Language Specification, Java SE 7 Edition写道:
下表列举了在某些转换转换中使用的转换。每次转化都用符号表示:
⇓表示缩小参考转换(第5.1.6节)
⊔表示取消装箱转换(第5.1.8节)
并且下表说明从Object转换为double为
⇓,⊔
即。从Object
到double
的演员阵营是Double
的演员阵容,然后是取消装箱转换为double
。
因此,当您编译Java 6时,您的团队成员很可能正在编译Java 7。
答案 2 :(得分:2)
JLS #5.5详细介绍了允许的转换转换。特别是,允许这种转换:
- 缩小引用转换(第5.1.6节),可选地后跟取消装箱转换(第5.1.8节)或未经检查的转换(第5.1.9节)
在您的情况下,如果cellValue
为双倍,则允许来自Object
的强制转换,并尝试将Object
投射到Double
,然后取消{{1}转到Double
。