8

我正在尝试按如下方式创建一个集合数组。

ArrayList<Integer> ar[]=new ArrayList<Integer>[50];

但它给了我一个错误->通用数组创建 任何人都可以解释我为什么会这样吗?

4

6 回答 6

5

您不能创建泛型类型的数组。改为使用集合集合:

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
于 2013-01-07T08:51:55.163 回答
1

ArrayList在内部是一维数组本身。你需要什么二维数组,这样你就可以创建

ArrayList<Integer[]> ar=new ArrayList<Integer[]>();

或者

ArrayList<ArrayList<Integer>> = new ArrayList<ArrayList<Integer>>();
于 2013-01-07T08:57:19.130 回答
1

实际上你可以有一个集合数组,只是不允许集合有一个特定的类型。
你可以做类似的事情

    ArrayList<?>[] ar = new ArrayList<?>[50];  
    // or ArrayList[] ar = new ArrayList[50];
    ar[0] = new ArrayList<Integer>();

但是您不会获得泛型的好处 - 集合的内容没有类型信息,您需要在从中读取时进行转换

    Integer i = (Integer) ar[0].get(0);
于 2013-01-07T10:54:37.793 回答
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>
于 2013-01-07T08:55:38.647 回答
0

您可以“技术上”拥有一个 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 数组

于 2013-01-07T09:23:57.200 回答
0

您的问题的答案可以在 Java 语言规范中找到。您正在尝试使用Array Creation Expression创建一个数组。它说以下内容:“如果 ClassOrInterfaceType 不表示可具体化的类型,则这是一个编译时错误”。因为 Java 中的数组是在运行时创建的,所以它们的类型信息应该在运行时完全可用。换句话说,数组元素类型应该是可具体化的类型。Java 中的泛型是使用类型擦除来实现的(即,只有泛型编译时类型信息的子集在运行时可用)因此它们不能通过定义来具体化,因此您不能创建泛型类型的数组。

于 2013-01-07T09:26:48.390 回答