簡體   English   中英

原始類型和 <?> 在泛型

[英]Difference between raw types and <?> in Generics

它可能會被問到某個地方,但我找不到它。

請告訴我兩者之間的確切區別:

ArrayList list = new ArrayList();

ArrayList<?> list = new ArrayList();

我無法弄清楚這兩者之間的確切區別。

謝謝...

ArrayList<?>只是表示“任何類型”。 換句話說,可以將任何類型的ArrayList分配給這樣的變量。 這可能是ArrayList<Integers>ArrayList<JButton>或其他任何東西。 單獨使用通配符,不使用關鍵字super(后跟類型),意味着您不能將任何內容添加到定義為ArrayList<?> 但是, ArrayList本身就意味着舊式無類型ArrayList ,您可以執行各種操作,包括add

List<?> list;
List<Integer> ints = new ArrayList<Integer>();
List<Integer> strings = new ArrayList<Integer>();
list = ints; // valid
list = strings; // valid
list.add("new"); // compile error

更新:

假設我有以下方法:

void insert(List list) {
   // loop through list, do whatever you like
   list.add("my string"); // dangerous operation 
}

現在,如果我調用insert(ints)編譯器將生成警告,但不會阻止我將String添加到整數列表中。 更改方法如下:

void insert(List<?> list) {
   // loop through list, do whatever you like
   list.add("my string"); // compiler error on this dangerous operation
}

會阻止我做這樣的操作。

ArrayList list = new ArrayList();

我們聲明一個可以接受任何類型對象的數組列表。

例如:

list.add(new Dog());
list.add(new Person());
list.add("Test");

對於ArrayList<?> list = new ArrayList();

我們使用泛型聲明一個數組列表,可以使用外卡接受任何對象

這里的問題是我們無法向該數組列表添加元素。

這段代碼甚至不會編譯:

ArrayList<?> list = new ArrayList();
list.add("test");

更新

我認為唯一的目的是什么? 泛型中的通配符將由extends關鍵字耦合。

ArrayList<? extends Animal> list = new ArrayList<Dog>();

在這種情況下,我們將任何對象添加到擴展Animal對象的列表

或者作為參數傳遞給方法。

public void foo(List<?> list) { }

在這種情況下,方法foo無法將對象添加到參數列表中

ArrayList list = new ArrayList();

這是一個早於java泛型的非參數化容器。 從中讀出的對象通常必須被強制轉換才能得到你想要的東西。

ArrayList<String> list = new ArrayList<String>();

在這里,我們指定容器包含String對象。 讀出時不需要鑄造。

<?>

是一個通配符參數,意思是“東西”,如String,Integer等。
注意, ArrayList<?> list = new ArrayList()是無效的語法; 通常,通配符將用於方法參數等。

行為沒有區別。

真正的區別在於編譯器對待它們的方式。 在第一種情況下,您告訴編譯器“將其視為原始類型”並​​且不要嘗試進行任何通用的靜態類型。 在第二種情況下,您說“將其視為泛型類型”...但實際的類型參數是“我們要避免在此處指定的某種類型”。

請注意,在需要明確類型的情況下,不能使用<?>通配符語法。

@ SJuan76評論道:

“(我猜他們沒有添加該功能只是為了獲得一些代碼來產生編譯錯誤)”

嗯,實際上你可以說那他們做的。 或者更確切地說,他們離開舊表單,以便使用Java 5+編譯器繼續編譯舊的(Java 5之前的)代碼而不會出現編譯錯誤。

ArrayList <? >表示未知類型的數組列表。 它被稱為通配符類型。

使用外卡,會發生以下情況

Collection<?> c = new ArrayList<String>();
c.add(new Object()); // Compile time error

如果沒有通配符,您可以將任何您喜歡的內容添加到陣列中

暫無
暫無

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

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