![](/img/trans.png)
[英]List<?> list = new ArrayList<String>(); List<? extends Object> list = new ArrayList<String>();
[英]Why List<Object> list = new ArrayList<String>() this give TypeMismatch error
List<Object> list = new ArrayList<String>()
當我使用上述行編譯器時,會給我類型不匹配錯誤。 但是據我了解,Object是String的超類,如果我創建對象列表,則它也應該接受String。 那么,為什么上述說法是錯誤的。 我正在尋找一個解釋。
一句話,因為
泛型類型不是多態的
也就是說,即使java.lang.String
是一個亞型java.lang.Object
多態性並不適用於泛型類型。 它僅適用於集合類型。 從而
List<Object> list = new ArrayList<String>(); //this isn't valid
List<Object> list = new ArrayList<Object>(); //valid
List<? extends Object> list = new ArrayList<String>();//valid
因為您定義了可能與之關聯的列表。
正確的方法是
List<?> list = new ArrayList<String>();
這與
List<? extends Object> list = new ArrayList<String>();
A
是B
的超類型,並不意味着List<A>
是List<B>
的超類型。 如果這樣的主張成立,類型系統的一致性就會受到侵犯。 考慮以下情況:
// ! This code cannot pass compilation.
List<String> list1 = new ArrayList<String>();
List<Object> list2 = list1; // Error
// Previous conversion causes type contradiction in following statements.
list2.add(new SomeOtherClass());
String v = list1.get(0); // list1.get(0) is not String!
這就是為什么List<Object>
不應是List<String>
超類型。
只需替換:
List<Object> list = new ArrayList<String>()
與
List<String> list = new ArrayList<String>()
要么
List<Object> list = new ArrayList<Object>()
在此使用相同的數據類型進行操作很重要
或者你也可以使用
List<?> list = new ArrayList<Object>();
變量聲明的類型必須與您傳遞給實際對象類型的類型匹配。 如果聲明List<Foo>
foo,則分配給foo引用的任何內容都必須是通用類型。 不是<Foo>
的子類型。 不是<Foo>
的supertype
。
Simple Generic types are not polymorphic
List<Parent> myList = new ArrayList<Child>() \\\\ Invalid
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.