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内部的には 1D 配列そのものです。2D 配列を作成するために必要なもの

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 の配列を使用できますが、少しうるさいです。として作成し、ArrayList<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 に答える