![](/img/trans.png)
[英]In java generic programming, is the Object class upper bound or lower bound of the parameter type without wildcard?
[英]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
? 當然。 Integer
是Object
的子類型,它是包含的所有類型的子類型? super Object
? super Object
(當然,在這種情況下,只有Object
滿足這一點)。
您將type參數與可以傳遞給方法的內容混淆。 List<? super Object>
的類型參數 List<? super Object>
是一個未知類型,它是Object
的超類型,因此Integer
或String
不能是實際的類型參數。 實際上,在這種情況下,唯一有效的實際類型參數是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.