2008-12-30 58 views
11

簡單表達式等Java編譯器如何解析類型轉換?

(x) - y 

取決於x是否是一種類型的名稱或不被解釋不同。如果x不是類型名稱,則(x) - y僅從x減去y。但是,如果x是類型名稱,則(x) - y計算y的負數,並將結果值轉換爲x

在典型的C或C++編譯器中,x是否爲類型的問題是可以回答的,因爲解析器一旦處理typedef或struct聲明就將這些信息傳遞給詞法分析器。 (我認爲這種要求的違反級別是C設計中最難處理的部分)。

但是在Java中,x可能在源代碼後面纔會定義。 Java編譯器如何消除這種表達式的歧義?

很明顯,Java編譯器需要多次傳遞,因爲Java不需要使用前聲明。但是這似乎意味着第一遍必須在解析表達式時做一個非常草率的工作,然後在稍後的傳遞中進行另一個更精確的表達式分析。這似乎很浪費。

有沒有更好的方法?

回答

8

我想我找到了滿足我的解決方案。感謝mmyers,我意識到我需要檢查類型轉換語法的形式規範。

模糊是由+-是一元和二元運算符造成的。這是衆所周知的 - 除非投採用的是原始類型

CastExpression: 
     (PrimitiveType Dimsopt) UnaryExpression 
     (ReferenceType) UnaryExpressionNotPlusMinus 

(見http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#238146

所以,'+''-'明確立刻鑄造的')'後不允許的:Java的解決了這個語法問題由編譯器先驗。

2

我只是測試它,而這個代碼:

Double y = new Double(0.1); 
System.out.println((Double)-y); 

給出了一個編譯錯誤:

operator - cannot be applied to Double, java.lang.Double .

把括號圍繞-y使得它編譯罰款。所以顯然,Java通過簡單地不允許它在語法中解決了這個問題(如果這是正確的術語;我不是編譯器方面的專家)。

+0

我沒有downvote,但如果不是double,那麼你使用了double,編譯器就會允許它,因爲_operator -_可以應用於雙打。我相信這是不贊成的。 – 2008-12-30 17:46:53

+0

自Java 1.5以來,您可以使用任何算術運算符與雙打,浮動等(由於自動裝箱)。正如我所說,添加圓括號使得它無錯地編譯。 – 2008-12-30 17:51:29