[英]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.