2013-05-07 90 views
2
public class Ambiguity { 
    public static void main(String[] args) { 
     int Integer = 3; 
     System.out.println((Integer) null);  // cast; prints "null" 
     System.out.println((Integer) - Integer); // subtraction; prints "0" 
     System.out.println((Integer) (-Integer)); // cast; prints "-3" 
    } 
} 

在Java中,我可以聲明一個名爲Integer的變量,然後編寫可以對Integer類或涉及Integer變量的表達式進行強制轉換的代碼。 Java如何解決類名和變量名之間的歧義?規範中是否有正式規則?這是一個特設的啓發式事物嗎?我知道C編譯器必須處理類似的問題,我知道how they deal with it,但Java似乎更寬容。Java語法歧義

+0

你能分享更多細節嗎?你讀過關於Autoboxing嗎? – Geek 2013-05-07 06:56:56

+0

您需要發佈代碼 – 2013-05-07 06:57:55

+0

我試過了,但該網站不會讓我。我將在編輯中再次嘗試。編輯:好的,現在有一個代碼示例。 – user2357112 2013-05-07 06:59:51

回答

-1

沒有歧義,編譯器總是期望Class或變量,兩者都不適合。例如。在分配新建分配FY

Integer Integer = 1; 
    Integer = new Integer(1); 
    Integer = Integer + 1; 

1)總有鍵入/變量名對

2)可以調用新僅在算術運算一類

3)不能被任何類名

+2

'(Integer)-Integer'在我看來像編譯器可以將第一個Integer類解釋爲類或變量。 – user2357112 2013-05-07 07:08:32

+0

爲什麼?試着把雙倍它不會工作,(雙) - ...壞語法 – 2013-05-07 07:27:41

2

請參閱JLS for evaluation order

「Java編程語言保證操作符的操作數看起來像是按照特定的評估順序進行評估,即從左至右「。

(Integer) -Integer 

現在,當這個被解析,其明確表示,有一個減法運算符(Integer)Integer爲操作數。從左開始,括號表達式應該被評估爲一個值(因爲其後跟和運算符),因此它不會假設Type爲變量。

(Integer) (-Integer) 

當這個被解析,有兩個標記(每個括號內)而不任何操作,因此沒有歧義(的表達是否是值或類型)。第一個括號將始終是類型和表達式,隨後將始終評估爲要轉換的值。

+0

也許我應該改寫我的問題。我知道,將一個變量命名爲一個類並不會使這個變量和這個類有任何關係;我的問題是關於由同名命名的類和變量引起的解析歧義。特別是,編譯器如何確定'(Integer)-Integer'是一個減法,而'(Integer)(-Integer)'是一個演員? – user2357112 2013-05-07 07:18:10

+0

請參閱我的編輯。 – Santosh 2013-05-07 07:58:04

0

據我所知,解析器從右到左。 第一個說法很明顯。

在第二個語句中,解析器首先找到一個變量,然後在該符號後找到一個表達式「 - 」來表示另一個變量,但他找到了一個正確的括號,這意味着他首先需要解析括號中的表達式。在你的例子中只有變量。因此,解析器將該值與另一個變量相減。

在第三個語句中,解析器首先找到一個右括號=>他將解析表達式(-3)內的表達式,然後他沒有找到任何操作(+,*,/, - eg),所以下一個Braket表示這是一個Cast。