我一直对ArrayLists的数组有这个问题。也许你可以帮忙。关于ArrayList的Java问题<Integer> [] x
//declare in class
private ArrayList<Integer>[] x;
//in constructor
x=new ArrayList[n];
这会生成关于未检查转换的警告。
但
x=new ArrayList<Integer>[n];
是一个编译器错误。
有什么想法?
谢谢!
我一直对ArrayLists的数组有这个问题。也许你可以帮忙。关于ArrayList的Java问题<Integer> [] x
//declare in class
private ArrayList<Integer>[] x;
//in constructor
x=new ArrayList[n];
这会生成关于未检查转换的警告。
但
x=new ArrayList<Integer>[n];
是一个编译器错误。
有什么想法?
谢谢!
你不能让泛型列表的数组。幸运的是,有解决方法。更值得庆幸的是,有一个关于Generics的好网站,它提供了比你想知道的更多信息。链接直接到Java Generics部分的数组中。
我认为你不能做通用的ArrayList数组,因为没有通用的信息将可在runtime.Instead你可以这样做:
List<Integer>[] arr=new ArrayList[30];
arr[0]=new ArrayList<Integer>();//create new arraylist for every index.
ArrayList<?>[] x;
x=(ArrayList<? extends Integer>[]) new ArrayList<?>[10];
x[0] = new ArrayList(1);
运行流动代码:
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>();
}
应该不会是一个错误。警告就足够了。如果没有人能够创建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
时会立即发生运行时错误,因此失败很快。
关于泛型和数组,有很多关于SO的问题和答案。 – extraneon 2011-03-11 11:25:05
为什么不试试列表<列表>? –
2011-03-11 11:26:48
这并不完全回答你的问题,但你正在尝试使用ArrayLists数组,所以你可能更适合使用Integer数组的LinkedList。 – atx 2011-03-11 11:39:32