[英]Java generic parameters and inheritance
假設我們知道ViewGroup擴展了View。
此外,我們有一個通用的,參數化的class A<T extends View>
題:
為什么方法C.add()
接受new A<ViewGroup>()
作為參數?
由於多態性,它不行嗎?
解決方案:唱歌加? extends View
? extends View
可以添加接受new A<ViewGroup>()
作為參數。
您將add
方法簽名為:
static void add(A<View>)
但是您可能的意思是:
static void add(A<? extends View> a)
不太完全是因為add()
可能正在使用ViewGroup
找不到的View
方法。
摘要: View
是ViewGroup
,但是ViewGroup
不是View
。 多態是您可以將View
對象分配給ViewGroup
聲明的地方。
首先,您的問題不是很清楚,因為UML圖與您的文本矛盾。 您說View擴展了ViewGroup,但是該圖顯示了相反的內容:ViewGroup擴展了View。
現在, List<Car>
不會擴展List<Vehicle>
。 如果是這樣,您可以執行以下操作:
List<Car> listOfCars = new ArrayList<Car>();
List<Vehicle> listOfVehicles = listOfCars;
listOfVehicles.add(new Bicycle());
// now the list of cars contain a bicycle. Not pretty.
首先,您說View擴展了ViewGroup,但圖中顯示ViewGroup擴展了View(我認為是正確的)。
其次,不允許將List<ViewGroup>
作為List<View>
傳遞。 這是一種編譯時保護,可以防止某人將AnotherView添加到此列表中並損害泛型的類型安全性。
List<ViewGroup>
不是List<View>
的子類型,但是它是List<? extends View>
的子類型List<? extends View>
List<? extends View>
。 因此,您可以修改您的方法以接受List<? extends View>
而是改為List<? extends View>
,但要注意,您不能以這種方式添加到傳遞給該方法的列表中。
與上面提到的上限通配符相反,還有另一種語法稱為下限通配符( List<? super ViewGroup>
),它使您可以添加到列表中,但可以通過任何方式傳入ViewGroup或其父級列表。
有關泛型通配符的更多信息,請參見: http : //download.oracle.com/javase/tutorial/java/generics/wildcards.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.