2013-02-03 132 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