项目如何在eclipse中编译,但javac会抛出编译器错误?

时间:2013-02-03 20:56:23

标签: java eclipse compiler-errors

处理学校的组项目,当我在命令行中运行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

3 个答案:

答案 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为

  

⇓,⊔

即。从Objectdouble的演员阵营是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