1

次のコードではpn.get(8).get(8)、配列を返すことを期待していますIntegers(この例では配列の長さは 1 ですが、私のプログラムではそれよりも長いです)。代わりに、の配列を取得しObjectsます。

誰かがなぜ私が間違っているのか教えてください。

ArrayList<ArrayList<HashSet<Integer>>> pn =
    new ArrayList<ArrayList<HashSet<Integer>>>();

for (int x = 0; x < 9; x++) 
{
    pn.add(x, new ArrayList<HashSet<Integer>>());

    for (int y = 0; y < 9; y++) {
        pn.get(x).add(y, new HashSet<Integer>());
        pn.get(x).get(y).add(new Integer(x));
    }
}


for (Integer i: pn.get(8).get(8).toArray())
{
    System.out.println(i);
}
4

5 に答える 5

3

必要なのは、ステートメント内のtoArray()呼び出しを削除することだけです。これは、期待していたのではなく返されます。これは、Java が型消去を使用してジェネリックを実装する方法の成果物です。実行時、JVM はタイプが であることを認識しないため、配列を返す必要があります。forObject[]Integer[]HashSetIntegertoArray()Object[]

ありがたいことに、HashSet直接繰り返すことができるので、toArray()呼び出しは不要です。以下は私にとってはうまくいきます:

ArrayList<ArrayList<HashSet<Integer>>> pn = new ArrayList<ArrayList<HashSet<Integer>>>();

for (int x = 0; x < 9; x++) 
{
    pn.add(x, new ArrayList<HashSet<Integer>>());

    for (int y = 0; y < 9; y++) {
        pn.get(x).add(y, new HashSet<Integer>());
        pn.get(x).get(y).add(new Integer(x));
    }
}


for (Integer i: pn.get(8).get(8))
{
    System.out.println(i);
}
于 2013-04-18T09:48:52.670 に答える
1

を削除するtoArray()と、 が返されますがObject[]、ループ変数は であるIntegerため、エラーが発生します。

for (Integer i: pn.get(8).get(8))
  {
       System.out.println(i);
  }
于 2013-04-18T09:49:21.383 に答える
1

<Collection>.toArrayデフォルトでは、型なし ( Object) 配列を返します。それを入力するには、つまり、使用するタイプ(Integerあなたの場合)を使用するには、次を使用します。

Integer[] integers = pn.get(8).get(8).toArray(new Integer[pn.get(8).get(8).size()]);
于 2013-04-18T09:49:39.383 に答える