簡體   English   中英

Java通用通配符:如果有什么需要? 延伸T,T有什么問題?

[英]Java generic wildcards: if something wants ? extends T, what's wrong with T?

   protected List<? extends ErrorTO> errors = new ArrayList<ErrorTO>();

    public abstract Collection<? extends ErrorTO> getErrors();

    public void registerError(ErrorTO e) {
        errors.add(e);
    }

有一行“errors.add(e)”的編譯錯誤,它期待某種類型的“?extends ErrorTO”並且不喜歡ErrorTO? 為什么和浩來解決這個問題? 謝謝!

編譯器不知道getErrors將返回Collection<ErrorTo> ; 它可能會返回Collection<SomeSubclassOfErrorTo> 如果您隨后嘗試將不屬於此子類的ErrorTo添加到集合中,則會違反類型安全性。 因此,編譯器不會允許您這樣做。

你不能向List<? extends ErrorTO>添加任何東西List<? extends ErrorTO> List<? extends ErrorTO> 將其設為List<ErrorTO>

List<? extends ErrorTO> List<? extends ErrorTO>表示:一些未知類的列表,它是ErrorTO或擴展ErrorTO。 很明顯,如果你可以添加一些東西,它的類型安全性就會被打破。

List<? extends ErrorTO> List<? extends ErrorTO> 不是一個可以包含任何擴展ErrorTO

它是ErrorTO的(未指定的)子類的ErrorTO

如果MyErrorTO擴展了ErrorTO ,那么我可以創建一個List<MyErrorTO>並將其分配給errors

然后你的代碼會嘗試將ErrorTO添加到我的List中,這是非法的 - 我的List只能包含一個特定的ErrorTO子類

也許這會有所幫助。 讓我們說我們有課程

class Fruit {}
class Pear extends Fruit{ void methodA(){} }
class Apple extends Fruit{ void methodB(){} }

我們想要創建這樣的方法

public static void method(List<? extends Fruit> list, Fruit f) {
    list.add(f); //<-- why is this forbidden?
}

作為list參數,此方法可以接受類似的列表

ArrayList<Fruit>
ArrayList<Apple>
ArrayList<Pear>

如果參數是new ArrayList<Pear>(); 那么編譯器不應該允許添加像Fruit或Apple這樣的元素。

但編譯器無法知道他將處理什么樣的列表。 由於缺乏知識,不可能通過List<? extends Fruit> list添加任何元素List<? extends Fruit> list List<? extends Fruit> list reference。

暫無
暫無

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

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