2011-03-11 18 views
5

我一直對ArrayLists的數組有這個問題。也許你可以幫忙。關於ArrayList的Java問題<Integer> [] x

//declare in class 
private ArrayList<Integer>[] x; 

//in constructor 
x=new ArrayList[n]; 

這會生成關於未檢查轉換的警告。

x=new ArrayList<Integer>[n]; 

是一個編譯器錯誤。

有什麼想法?

謝謝!

+0

關於泛型和數組,有很多關於SO的問題和答案。 – extraneon 2011-03-11 11:25:05

+2

爲什麼不試試列表<列表>? – 2011-03-11 11:26:48

+0

這並不完全回答你的問題,但你正在嘗試使用ArrayLists數組,所以你可能更適合使用Integer數組的LinkedList。 – atx 2011-03-11 11:39:32

回答

5

你不能讓泛型列表的數組。幸運的是,有解決方法。更值得慶幸的是,有一個關於Generics的好網站,它提供了比你想知道的更多信息。鏈接直接到Java Generics部分的數組中。

3

我認爲你不能做通用的ArrayList數組,因爲沒有通用的信息將可在runtime.Instead你可以這樣做:

List<Integer>[] arr=new ArrayList[30]; 
arr[0]=new ArrayList<Integer>();//create new arraylist for every index. 
0
ArrayList<?>[] x; 
x=(ArrayList<? extends Integer>[]) new ArrayList<?>[10]; 
x[0] = new ArrayList(1); 
0

運行流動代碼:

public class Test { 
    ArrayList<Long>[] f0; 
    ArrayList<Long> f1; 
    ArrayList[] f2; 
    public static void main(String[] args) { 
     Test t = new Test(); 
     Field[] fs = t.getClass().getDeclaredFields(); 
     for(Field f: fs){ 
      System.out.println(f.getType().getName()); 
     } 

    } 

} 

您將獲得:

[Ljava.util.ArrayList; 
java.util.ArrayList 
[Ljava.util.ArrayList; 

由於Java不支持通用陣列。當你聲明:

private ArrayList<Integer>[] x; 

編譯器會認爲它是:

private ArrayList[] x; 

所以,你應該做的那樣:

int n = 10; 
ArrayList<Long>[] f = new ArrayList[n]; 
for(int i=0;i<n;i++){ 
    f[i] = new ArrayList<Long>(); 
} 
0

應該不會是一個錯誤。警告就足夠了。如果沒有人能夠創建ArrayList<Integer>[],那麼確實沒有意義。

由於javac還沒有做我們的青睞,我們可以創建數組自己:

@SuppressWarnings("unchecked") 
<E> E[] newArray(Class<?> classE, int length) 
{ 
    return (E[])java.lang.reflect.Array.newInstance(classE, length); 
} 

void test() 
    ArrayList<Integer>[] x; 
    x = newArray(ArrayList.class, 10); 

的類型約束不健全,調用者應該確保確切類傳入的好消息。如果傳入了錯誤的類,則在將結果分配給x時會立即發生運行時錯誤,因此失敗很快。