2011-01-21 104 views
0

我只是在玩耍,想到了一個想法,我決定嘗試一下: 製作一個包含更多ArrayList的ArrayList。如何回收您聲明爲ArrayList的泛型類型爲Java?

例如,我創建了一個名爲intList的ArrayList,它包含整數,然後用值填充它。之後,我做了一個stringList,並填充它。然後我創建了一個ArrayList,其中包含名爲aList的其他ArrayList,並將intList和stringList添加到它。

現在我面臨的問題是,如果我從aList中檢索對象,它不會識別泛型類型是int還是string。

這裏是我試過的代碼:

import java.util.*; 

public class Practice { 
    public static void main(String[] args) { 

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

    ArrayList<int> intList = new ArrayList<int>(); 
    intList.add(1); 
    intList.add(2); 
    intList.add(3); 

    ArrayList<String> stringList = new ArrayList<String>(); 
    stringList.add("One"); 
    stringList.add("Two"); 
    stringList.add("Three"); 

    list.add(intList); 
    list.add(stringList); 

    for(ArrayList lst : list) { 
     for(ArrayList lt : lst) { 
     System.out.println(lt); 
     } 
    } 
    } 
} 
+0

[確定列表條目類型]的可能重複(http://stackoverflow.com/questions/3566541/determining-the-type-of-list-entries) – finnw 2011-01-21 11:32:36

回答

3

Java有「泛型類型擦除」,這意味着該類型參數泛型是「刪除」。一旦你創建了ArrayList<T>,沒有辦法找出T是什麼。

0

由於沒有類型信息存儲在泛型類型,你可以從子列表獲取元素並檢查它的類型:

for(ArrayList subList : list) { 
    if (subList.size() > 0) { 
     Class elementClass = subList.get(0).getClass(); 
     // do something else with it 
    } 
} 

但是:

  1. 它不會工作,如果子列表是空
  2. 通常,在另一個列表中存儲幾個不同類型列表的概念看起來很奇怪。
0

類型擦除意味着在運行時類型被擦除。這就是爲什麼你可以從一個普通到另一個投:

import java.util.ArrayList; 

public class Test { 
     public static void main(String [] args){ 
       ArrayList<String> list = new ArrayList<String>(); 
       ArrayList list2 = (ArrayList)list; 
       list2.add(new Integer(5)); 
       System.out.println(list2.get(0).getClass()); 
     } 
} 

將輸出:

class java.lang.Integer 
1

只有類類型可以作爲泛型類型參數,所以你不能有一個ArrayList<int>。改爲使用ArrayList<Integer>

此外,您的循環中使用的類型是錯誤的。由於list是值列表的列表,因此lst是值的列表,這意味着您的lt變量將是整數或字符串,而不是另一個ArrayList

這裏更深層的問題是您仍在使用原始類型,因此編譯器無法爲您找到該錯誤。您應該聲明list類似List<List<? extends Object>>。這樣,您可以將ArrayList<Integer>ArrayList<String>添加到它,並在循環中將值提取爲類型Object

0
import java.util.*; 

public class Practice { 
    public static void main(String[] args) { 

    List<ArrayList<?>> list = new ArrayList<ArrayList<?>>(); 

    ArrayList<Integer> intList = new ArrayList<Integer>(); 
    intList.add(1); 
    intList.add(2); 
    intList.add(3); 

    ArrayList<String> stringList = new ArrayList<String>(); 
    stringList.add("One"); 
    stringList.add("Two"); 
    stringList.add("Three"); 

    list.add(intList); 
    list.add(stringList); 

    for(ArrayList<?> lst : list) { 
     for(Object lt : lst) { 
     System.out.println(lt); 
     } 
    } 
    } 
}