簡體   English   中英

為什么列出 <Object> list =新的ArrayList <String> ()這會導致TypeMismatch錯誤

[英]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>();

AB的超類型,並不意味着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.

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