您不能创建 T 数组,因为 Java 在运行时不知道 T 的类型是什么。这是因为在 Java 中泛型是通过类型擦除实现的。这意味着编译器在确保一切正常后会丢弃大部分泛型类型信息。
对于数组,情况就不同了,因为 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;
}