2011-03-11 37 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时会立即发生运行时错误,因此失败很快。