2013-02-03 102 views
3

在学校的团体项目上工作,当我在命令行中运行javac时,下面一行会引发错误。如何在eclipse中编译项目,但javac会抛出编译器错误?

Object result = engine.eval(equation); //evaluate the arithmetic expression 
cellValue = (double) result; // <-- This throws a compiler error (obviously) 

但是由于某种原因,这个编译和工作(!)在日食,我的同学们正在使用。我试图证实,因为我无法相信。

ScriptEngine engine = manager.getEngineByName("JavaScript"); 

引擎是一个ScriptEngine,如果这是相关的。我不知道eclipse的编译器是如何编译一行的,直接将Object转换为double

+0

是双或双?如果是,那么该行应该编译。 – assylias

+0

你为什么认为编译器错误是“显而易见的”? – gefei

+0

,因为它试图将一个对象转换为原始类型...... – mavix

回答

6

也许你的朋友正在使用另一个版本的Java语言。演员Objectdouble(原始类型)似乎在Java 7中合法,但在Java 6中不合法。您可以让您的朋友在Eclipse中更改其项目设置或将您的编译器更新到版本7.

注意该铸造ObjectDouble(该类)在两个版本中都可以工作。

+0

我的机器上安装了两个版本的Java,卸载Java JDK 6允许它编译。 – mavix

2

允许的转换转换详见JLS #5.5。特别地,这种转换是允许:

  • 变窄引用转换(第5.1.6节)任选地随后要么取消装箱转换(§5.1.8)或未经检查的转换(§5.1.9)

在你的情况,如果cellValue是双,从Object剧组被允许,并会尝试投ObjectDouble然后拆箱Doubledouble

+0

Java语言规范中对Java 5和6也存在同样的句子。我认为这意味着'double d =(Double)object'被允许,而不是'double d =(double)object'。 – meriton

+0

我明白你的意思了。我认为它允许'double d =(double)object;'根据下面的表5.1,明确允许从Object到double的强制转换(以及明显的Object to Double)。 – assylias

+0

啊,你说得对。我误解了旧规格,在那里有一个几乎(但不完全)相同的措词的新句子。有一个upvote :-) – meriton

5

它出现在允许的转换已被爪哇5和7之间延伸。在Java Language Specification, 3rd edition (for Java 5 and 6)

引用类型的值可以通过解包转换被转换为基本类型(§5.1.8) 。

拆箱转换将引用类型的值转换为原始类型的对应值。具体而言,下列8的转换被称为取消装箱转换:

  • 从类型布尔输入布尔
  • 从类型字节为byte类型
  • 从类型字符键入字符
  • 从类型短键入短
  • 从整数类型为int类型
  • 从Long类型为long类型
  • 从Float类型为float类型
  • 从类型翻一番,所以Java 5中6型双

,铸造Objectdouble是不合法的。

Java Language Specification, Java SE 7 Edition写:

下表枚举哪些转换在某些铸造转换使用。每个转换由符号所指:

⇓表示缩小参考转换(第5.1.6节)

⊔表示取消装箱转换(§5.1.8)

和下表表示的铸造从对象到双待

⇓,⊔

即从Objectdouble的演员阵容是Double,随后是拆箱转换为double

它因此cellValue很可能是你的队友被编译为Java 7,当您正在编译为Java 6