2012-08-24 105 views
1

可能重複:
Adding an element inside a wildcard type ArrayList通配符類型的泛型

我不明白爲什麼編譯器認爲該代碼錯誤:

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

中的方法Pair<? extends Employee>有如下:

? extends Employee getFirst() 
void setFirst(? extends Employee) 

不清楚爲什麼我們不能設定價值,因爲Employee? extends Employee的子類型。 Java教程試圖解釋它,但我仍然有我的問題。 有人可以澄清嗎?

+0

'lowlyEmployee'是什麼類型? –

+0

僱員的子類型 – damluar

回答

3

對於編譯器來說,? extends Employee意味着Employee的一個特定子類型,編譯器無法檢測到哪個子類型。所以它不能讓你插入任何員工。

欲瞭解更多信息請參考這個問題: What is PECS (Producer Extends Consumer Super)?
或閱讀Generics FAQ由安格蘭格。

+0

在我的理解中,「?extends Employee」是以Employee爲父類型的任何類型。因此,如果我們知道集合包含員工的子類型,那麼我們可以在其中放置「經理」和「兼職員工」。但是,如果我們只考慮一個特定的亞型,那麼我的假設是錯誤的。 – damluar

+0

謝謝PECS,當我搜索答案時,它不在名單上。 – damluar

+0

你的理解有點偏離。它意味着一種特定的類型是Employee的子類型。它不會匹配任何舊的Employee對象。看到這個答案我給了更詳細的解釋。 http://stackoverflow.com/questions/11955515/t-extends-aninterface-vs-extends-aninterface/11955957#11955957 – Matt

2

閱讀<? extends Employee>不是「任何類型的員工」,而是「特定但未知的員工類型」。

wildcardBuddies仍然是一對管理者,只有現在的實際類型現在是未知的。我們知道我們可以讓員工離開,但我們不能設置任何東西,因爲我們不知道是否應該設置管理人員或LowlyEmployees。 Pair<? extends Employee>實際上變爲只讀。

+0

謝謝,我明白了! – damluar