2009-07-12 156 views
0

代碼:?(這將顯示編譯錯誤的行3)爲什麼會顯示compile_error?

Pair<Manager> managerBuddies = new Pair<Manager>(ceo, cfo); 
Pair<? extends Employee> wildcardBuddies = managerBuddies; // OK 
wildcardBuddies.setFirst(lowlyEmployee); // compile-time error 

錯誤是關於「無腐敗是可能的」

,什麼是wildcardBuddies的類型(Pair<? extends Employee> or Pair<Manager>

+2

什麼是錯誤? – Sean 2009-07-12 02:26:35

+0

lowlyEmployee來自哪裏? – Tom 2009-07-12 02:38:51

回答

3

代碼導致錯誤的原因是因爲無法知道Employee wildcardBuddies的特定子類將接受哪些子類。爲什麼編譯器不確定?爲了看到這一點,我們仔細看看代碼:

Pair<Manager> managerBuddies = new Pair<Manager>(ceo, cfo); 

這裏我們創建一對經理,它是Employee的一個子類。

Pair<? extends Employee> wildcardBuddies = managerBuddies; // OK 

在這裏,我們將剛剛創建的對分配給一對必須是Employee或其子類的對象。請注意,我們不是在此創建一個新對象,只是對第一對進行第二次引用。

wildcardBuddies.setFirst(lowlyEmployee); // compile-time error 

現在我們嘗試做一些不應該被允許的原因很簡單,lowlyEmployee 不是經理。請記住,雖然wildcardBuddies是對一對Employee子類型的引用,但它指向的對象特別是一對經理,並且不允許從超類(Employee)轉換爲子類(Manager)。由於編譯器無法檢查所有可能的場景,其中調用setFirst()將被允許在具有給定參數的實際底層對象上,它有一條規則將禁止所有非法行爲以及一些合法行爲。

希望這有助於更好地解釋PDF中的答案。如果我對任何事情都有錯,請有人糾正我。

相關問題