Java は実行時に T の型を認識しないため、T の配列を作成することはできません。これは、Java ではジェネリックが型消去で実装されているためです。これは、コンパイラが、すべてが OK であることを確認した後、ほとんどのジェネリック型情報を破棄することを意味します。
配列の場合は話が異なります。Java は特定の配列を作成するために T の正確な型を知る必要があり、そのようなことを決定できないため、ジェネリック型の配列を作成できないためです。
できることは、使用したい実際の配列のインスタンスを提供することであり、Java コンパイラーはそれが適切な型であることを確認できます。
public static <T> void fillWith(T[] destiny, List<? extends T> source){
for(int i=0; i<= destiny.length; i++){
destiny[i] = source.get(i);
}
}
このjava.utils.Arrays.copy
方法では、ジェネリックとリフレクションを慎重に使用して、やりたいことの参考として使用できる代替手段を提供します。
public static <T> T[] copyOf(T[] original, int newLength) {
return (T[]) copyOf(original, newLength, original.getClass());
}
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}