[英]Generic extend can't add the same type
我是這些泛型類型的新手。 在下面的代碼中,我創建了一個方法,該方法接受擴展了“字符串”的項目列表。
我的問題? -當列表可以分配一個新列表時,為什么不能添加字符串“ test” ...這給了我一個編譯錯誤。
public class Child {
public void takeList(List<? extends String> list){
list = new ArrayList<String>();
list.add("test");
}
}
因為與此處無關的不是運行時類型。 list
仍然是List<? extends String>
類型 List<? extends String>
,您剛將其分配給new ArrayList<String>()
。 考慮一下:
list = rand() ? new ArrayList<String>() : new ArrayList<NotString>();
編譯器可能無法確定list.add("test")
是否有效-它僅基於list
的編譯時類型進行決策。
請注意,實際上沒有任何東西可以擴展String
,這是final
課。
有細微的差別。 它需要一個列表,其中包含一種類型的事物(擴展字符串的事物)。 此列表可能是String的子類,因此不是String iyswim。 請參閱http://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html上限通配符。
如果它是
public void takeList(List<? *super* String> list){
然后,您可以向其中添加字符串,因為可以保證列表可以接受字符串。
當您具有帶通配符的變量以及采用通用類型參數的方法時,Java無法確保類型安全。 它必須不允許該調用。
考慮一個List<? extends Animal>
例如, List<? extends Animal>
。 您可能已為其分配了List<Dog>
,但可以為該變量分配了List<Squid>
。 您不應被允許在此列表中添加“ Dog
。
要允許調用add
方法,請刪除通配符。
public void takeList(List<String> list){
此外, String
是final
,所以真的沒有必要說? extends String
? extends String
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.