我正在尝试按如下方式创建一个集合数组。
ArrayList<Integer> ar[]=new ArrayList<Integer>[50];
但它给了我一个错误->通用数组创建 任何人都可以解释我为什么会这样吗?
我正在尝试按如下方式创建一个集合数组。
ArrayList<Integer> ar[]=new ArrayList<Integer>[50];
但它给了我一个错误->通用数组创建 任何人都可以解释我为什么会这样吗?
您不能创建泛型类型的数组。改为使用集合集合:
ArrayList<ArrayList<Integer>> = new ArrayList<ArrayList<Integer>>();
为什么我们不能创建一个泛型类型的数组?数组在内部存储它们的确切类型,但由于运行时的类型擦除,将没有泛型类型。所以,为了防止你被这个愚弄(见下面的例子)你不能创建一个泛型类型的数组:
//THIS CODE WILL NOT COMPILE
ArrayList<Integer>[] arr = new ArrayList<Integer>[5];
Object[] obj = arr;
obj[0] = new ArrayList<Long>(); //no one is safe
ArrayList
在内部是一维数组本身。你需要什么二维数组,这样你就可以创建
ArrayList<Integer[]> ar=new ArrayList<Integer[]>();
或者
ArrayList<ArrayList<Integer>> = new ArrayList<ArrayList<Integer>>();
实际上你可以有一个集合数组,只是不允许集合有一个特定的类型。
你可以做类似的事情
ArrayList<?>[] ar = new ArrayList<?>[50];
// or ArrayList[] ar = new ArrayList[50];
ar[0] = new ArrayList<Integer>();
但是您不会获得泛型的好处 - 集合的内容没有类型信息,您需要在从中读取时进行转换
Integer i = (Integer) ar[0].get(0);
你可以做这样的事情
ArrayList<Integer> ar[]= new ArrayList[50];
ArrayList<Integer> intArr = new ArrayList<Integer>();
ArrayList<Long> longArr = new ArrayList<Long>();
ar[0]=intArr;
ar[1]= longArr; // compile error Type mismatch: cannot convert from ArrayList<Long> to ArrayList<Integer>
您可以“技术上”拥有一个 ArrayList 类型的数组,但它有点挑剔。将其创建为 anArrayList<ArrayList<Integer>> list = ArrayList<ArrayList<Integer>();
并使用toArray(ArrayList<Integer>[list.size()]);
.
例子:
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
list.add(new ArrayList<Integer>());
list.add(new ArrayList<Integer>());
list.add(new ArrayList<Integer>());
int count = 1;
for(ArrayList<Integer> AList: list) {
for(int i = 0; i < 4; i++)
AList.add(count++);
}
ArrayList<Integer>[] check = list.toArray(new ArrayList[list.size()]);
for(ArrayList<Integer> AL : check) {
for(Integer i:AL) {
System.out.print(i + " ");
}
System.out.println();
}
输出:
1 2 3 4
5 6 7 8
9 10 11 12
有效并且是一个 ArrayList 数组
您的问题的答案可以在 Java 语言规范中找到。您正在尝试使用Array Creation Expression创建一个数组。它说以下内容:“如果 ClassOrInterfaceType 不表示可具体化的类型,则这是一个编译时错误”。因为 Java 中的数组是在运行时创建的,所以它们的类型信息应该在运行时完全可用。换句话说,数组元素类型应该是可具体化的类型。Java 中的泛型是使用类型擦除来实现的(即,只有泛型编译时类型信息的子集在运行时可用)因此它们不能通过定义来具体化,因此您不能创建泛型类型的数组。