Подтвердить что ты не робот

Почему Array.newInstance(класс <?>, Int) не является общим?

Я имею в виду, есть ли веская причина для этого? Метод получил следующую подпись:

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

На мой взгляд, было бы гораздо удобнее объявить метод следующим образом:

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

Таким образом, при создании арифтипического типа не требуется выполнять дополнительное литье, например

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? Для меня это кажется очень неудобным.

4b9b3361

Ответ 1

Вы можете использовать Array.newInstance(Class<?> componentType, int length) для создания

  • Массивы Объекты: Integer[] a = (Integer[])Array.newInstance(Integer.class, 5);
  • Массивы примитивов: int[] b = (int[])Array.newInstance(Integer.TYPE, 5);
  • Массивы Массивы: int[][] c = (int[][])Array.newInstance(b.getClass(), 5);

Второй пример иллюстрирует, почему этот метод не может просто вернуть общий массив объектов, поскольку массивы примитивов не являются массивом объектов (с массивами массивов, с другой стороны, есть).

Используя этот вспомогательный метод...

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

... с int[] b = newArray(Integer.TYPE, 5); приведет к ошибке компиляции:

Несовместимые типы, требуемые int [], но нашли T []

... и с int[] b = (int[])newArray(Integer.TYPE, 5); приведет к ошибке компиляции:

не может передать Object [] в int []