簡體   English   中英

通用擴展不能添加相同的類型

[英]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){

此外, Stringfinal ,所以真的沒有必要說? extends String ? extends String

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM