3

これは、ジェネリック配列を作成するための 2 つの方法からの次の質問です。

与えられた2つの方法で、

@SuppressWarnings("unchecked")
static <T> T[] array1(final Class<T> elementType, final int size) {

    return (T[]) Array.newInstance(elementType, size);
}
static <T> T[] array2(final Class<T[]> arrayType, final int size) {

    return arrayType.cast(Array.newInstance(arrayType.getComponentType(), size));
}

どちらの方法も、Object タイプに対しては正常に機能します。

final Integer[] objectArray1 = array1(Integer.class, 0);
final Integer[] objectArray2 = array2(Integer[].class, 0);

プリミティブに関しては、両方の呼び出しがコンパイルされません。

// array1
final int[] primitiveArray1 = array1(int.class, 0);
GenericArray.java:12: error: incompatible types
        final int[] primitiveArray1 = array1(int.class, 0);
                                            ^
  required: int[]
  found:    Integer[]
1 error
// array2
final int[] primitiveArray2 = array2(int[].class, 0);
GenericArray.java:13: error: method array2 in class GenericArray cannot be applied to given types;
        final int[] primitiveArray2 = array2(int[].class, 0);
                                      ^
  required: Class<T[]>,int
  found: Class<int[]>,int
  reason: inferred type does not conform to declared bound(s)
    inferred: int
    bound(s): Object
  where T is a type-variable:
    T extends Object declared in method <T>array2(Class<T[]>,int)
1 error

プリミティブ型をどのように扱うことができますか?

4

6 に答える 6

4

プリミティブはジェネリックと互換性がありません。たとえば、 を作成することはできずList<int>、 のタイプint.classClass<Integer>ではなく ですClass<int>。したがって、あなたが説明することは不可能です。

于 2013-06-21T01:31:42.610 に答える
1

これは通常の方法です:

int[] foo = (int[])Array.newInstance(int.class, 5);

ruakhが述べたように、プリミティブ型に対して何かを一般的に機能させることはできないため、何らかの方法で結果をキャストする必要があります。

于 2013-06-22T02:46:51.533 に答える
0

これは機能し、int [] を作成します。

final Object instance = Array.newInstance(Integer.TYPE, 0);
于 2013-06-21T01:55:49.380 に答える
0

プリミティブをジェネリックと共に使用することはできません。一方、Integer[]代わりに使用しint[]て、自動 (非) ボクシングに依存して、必要に応じて変換するintことができますInteger

于 2013-06-21T01:38:21.627 に答える
0

プリミティブをジェネリックと共に使用することはできませんObjects。ただし、ラッパーを使用できます: IntegerCharacterなど。

于 2013-06-21T01:39:50.347 に答える