为什么 Array.newInstance(Class<?>, int) 不是通用的?

2022-09-04 21:21:56

我的意思是,这有什么好的理由吗?该方法具有以下签名:

public static Object newInstance(Class<?> componentType,
                 int length)
                          throws NegativeArraySizeException

在我看来,将方法声明如下会更方便:

public static <T> T[] newInstance(Class<T> componentType, int length) 
                                          throws NegativeArraySizeException

这样,在创建通用类型的 aray 时,就不必执行其他转换,例如

public class Gen<T>{
    private T[] a;

    public static <T> Gen<T> createByClass(Class<T> clazz){
        a = clazz.cast(Array.newIntance(clazz.getComponentType(), 8); //we have to invoke 
                                                                      //clazz.cast here.
    }
}

是否有任何充分的理由将返回值类型声明为 ?对我来说,这似乎非常不方便。Object


答案 1

您可以使用 来创建Array.newInstance(Class<?> componentType, int length)

  • 对象数组:Integer[] a = (Integer[])Array.newInstance(Integer.class, 5);
  • 基元数组:int[] b = (int[])Array.newInstance(int.class, 5);
  • 数组的数组int[][] c = (int[][])Array.newInstance(b.getClass(), 5);

第二个示例说明了为什么此方法不能只返回对象的泛型数组,因为原始数组不是对象数组(另一方面,数组数组是)。

使用此帮助程序方法...

private static <T> T[] newArray(Class<?> type, int len){
    return (T[])Array.newInstance(type, len);
}

...with 将导致编译错误:int[] b = newArray(int.class, 5);

不兼容的类型,必需的 int[],但找到 T[]

...和 将导致编译错误:int[] b = (int[])newArray(int.class, 5);

无法将 Object[] 强制转换为 int[]


答案 2