簡體   English   中英

Object類真的可以下限嗎?

[英]Can the Object class really be a lower bound?

當String&Integer不是Object的超類時,為什么以下是合法的?

List<? super Object> mylist = new ArrayList<Object>();
mylist.add("Java"); // no compile error
mylist.add(2);

我知道外卡指南使用較低的有界外卡和超出'出'變量,但在這種情況下,似乎對象不起'下界'的作用。

這也是允許在列表中添加任何類型的唯一方法嗎?

這很簡單。 請記住,在Java中,子類型的實例也是其超類型的實例。

看看add的簽名

public boolean add(E e)

這意味着,無論你通過什么類型為E或任何亞型E

你有一個List<? super Object> List<? super Object> 所以你可以傳遞給myList.add()任何類型的東西? super Object ? super Object (可以是Object或其超類型的未知類型)或其任何子類型。

整數是包含的所有類型的子類型? super Object ? super Object 當然。 IntegerObject的子類型,它是包含的所有類型的子類型? super Object ? super Object (當然,在這種情況下,只有Object滿足這一點)。

您將type參數與可以傳遞給方法的內容混淆。 List<? super Object>類型參數 List<? super Object>是一個未知類型,它是Object的超類型,因此IntegerString不能是實際的類型參數。 實際上,在這種情況下,唯一有效的實際類型參數是Object 但是當你傳遞一些東西給你的方法時,你問的是,我正在傳遞一個子類型嗎? 答案是肯定的。

這是因為Object是Integer和String的超類。 你正在以相反的方式解釋泛型關系。

編輯

想想這種情況:

List<? extends myClass> listOfMyClass = new ArrayList<Object>();

在這種情況下,您最終會得到一個Object類型元素列表,但必須遵守listOfMyClass列表聲明所添加的限制。

您將能夠將屬於myClass層次結構的任何對象添加到列表中。 實現List接口的ArrayList將在請求時保存(並返回) Object類型元素。

當然,您可以定義:

List<? extends myClass> listOfMyClass = new ArrayList<mySuperClass>(); 

就像你現在一樣, ArrayList必須包含具有相同類型的對象或myClass的超類型,在這種情況下,它是mySuperClass 此列表將返回qhen請求的mySuperClass對象。

ClassX作為不屬於mySuperClass層次結構的類,以下行將無法編譯:

List<? extends myClass> listOfMyClass = new ArrayList<ClassX>(); 

那是因為ClassX不是myClass的超類。

我同意這令人困惑,但這就是正在發生的事情。

在這行代碼中:

List<? super Object> mylist...

你是說myList是一個List ,其中每個元素可以是一個類型,它的Object或超類Object 但是,您只是在這里聲明myList的類型。

通配符的作用是限制myList的實現。

然后,你這樣做:

List<? super Object> mylist = new ArrayList<Object>();

現在你正在做的是實例化一個ArrayList<Object> 您的下限通配符用於檢查這是否有效。 它是有效的,因為Object匹配? super Object ? super Object 此時,您有一個List<Object>並允許您隨后的方法調用。

暫無
暫無

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

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