2017-08-08 38 views
1

我開始在java中收集框架,我有一個簡單的代碼,但它使我好奇泛型類可能的參數。泛型類中的意外類型編譯錯誤,有什麼可能的參數呢?

import java.util.ArrayList; 
import java.util.LinkedList; 

class ListExa{ 
public static void main(String[] args){ 
    ArrayList<int> names = new ArrayList<int>(); 
    names.add(1); 
    names.add(2); 
    names.add(3); 
    names.add(4); 
    names.add(5); 

    System.out.println(names); 

} 
} 

ListExa.java:6: error: unexpected type 
       ArrayList<int> names = new ArrayList<int>();  
required: reference 
found: int 
+2

你想'ArrayList'具有'整數'或'字符串? –

+0

我明白了,只是將這段代碼編輯爲'Integer's –

+0

其實我不會問爲什麼是錯誤?,詢問泛型類可能有什麼可能的參數?我正在編輯所有編輯後可能錯誤的答案。 –

回答

2

這不是一個全新的答案,更多的是對已經說過的東西的總結。

隨着Java集合框架,作爲類型參數(在尖括號中)你的名字,你想在Collection(ListSet,...)來存儲對象的類型。

通過語言設計,不能使用基本類型,如int,long,double等,那裏只有引用類型。因此,如果要將整數存儲在ArrayList中,則必須執行ArrayList<Integer>而不是ArrayList<int>

但是後來在您的代碼中,您希望將字符串添加到列表中。爲了做到這一點,你的清單應該被宣佈爲ArrayList<String>。當試圖添加任何非Integer的東西時,ArrayList<Integer>將發出編譯錯誤。你可以申報ArrayList<Object>。那一個會接受所有類型的對象(String,Integer,Person,File,...),但是這違背了泛型背後的想法:儘可能專門告訴編譯器什麼類型的對象,你想在你的列表中允許並禁止其他人),避免奇怪的運行時錯誤。

而且它的好作風申報像

List<String> names = new ArrayList<>(); 

Collection<String> names = new ArrayList<>(); 

如果以後你決定一個LinkedListHashSet是數據結構更適合你的程序的需要,那麼你只需更改聲明的右側。

2

您需要使用類Integer,而不是基本類型int的:


由於jdk1.7可以使用diamond操作<>避免代碼重複:

ArrayList<String> names = new ArrayList<>(); 
             ^^ 
-1

收集僅支持對象,請使用整數,而不是INT

最佳實踐,我們不應該這樣寫ArrayList<Integer> names = new ArrayList<Integer>();

意味着總是給超基準所以它應該是這樣的

List<Integer> names = new ArrayList<Integer>(); 
+0

他的第一行本身是錯誤的,所以我糾正了這一點,顯然如果他添加字符串,所以它應該是列表 names = new ArrayList (); – user2862544

相關問題