簡體   English   中英

Java通用參數和繼承

[英]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方法。

摘要: ViewViewGroup ,但是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.

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