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

St.*_*rio 13 java arrays generics

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

public static Object newInstance(Class<?> componentType,
                 int length)
                          throws NegativeArraySizeException
Run Code Online (Sandbox Code Playgroud)

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

public static <T> T[] newInstance(Class<T> componentType, int length) 
                                          throws NegativeArraySizeException
Run Code Online (Sandbox Code Playgroud)

这样,当创建泛型类型的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.
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有充分的理由将返回值类型声明为Object?对我而言似乎非常不耐烦.

Pet*_*ser 12

你可以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);

第二个例子说明了为什么这个方法不能只返回一个通用的对象数组,因为primitves的数组不是对象数组(另一方面是数组的数组).

使用这个辅助方法......

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

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

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

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

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