2012-06-26 100 views

回答

1

請在「生產者延伸,消費超」(佩奇)讀了 - 我可能需要做同樣的:)

只讀:

如果你想確保方法需要作爲參數的一個項目集合(使用泛型) - 當您使用List<? extends T>時,列表可以包含T的任何子類型,但不能添加到集合中,因爲它不會在運行時知道列表包含的T的具體類型。

只寫:

對於List<? super T>,列表可以(使用超級會允許這種情況發生)包含牛逼不管實際參數化類型。

希望它有幫助。

0

您可以從List<? extends T>獲得一個T,但您唯一可以放入的是文字null。你可以把T放入List<? super T>,但你唯一能從中得到的是Object(然後不安全地將其丟棄到T)。

所以,這些限制使這些相當不錯,但不完美,提醒的意圖。如果使用List<? extends T>,則不能將大部分內容放入其中 - 因此它只是只讀的。和List<? super T>,你不能非常有用地得到的東西 - 所以它是有點寫只。

請注意,這些中沒有一個實際上是只讀或只寫。我注意到上面的一些方法可以讓它們進入或離開它們,使用「只讀」構造,您仍然可以調用remove函數,無論是在對象本身還是在它的迭代器上。

0

定義List<? extends T>的意思是「一個List<X>實施,其中X必須T或子類/實現它們。換句話說,你唯一保證就是已經存儲在列表中的對象將適合在T類型的變量。但是,由於該表可能被宣佈爲一個類擴展或實現T,你都難保T類型的對象本身將融入列表

簡單的例子:。List<String>List<? extends T>如果TObject你可以從中安全地繪製Object類型的對象,但您可以o顯然不會把其他Object類型的對象,除非他們肯定是字符串。