Стирание типа Java и массивы

В документе оракула говорится, что дженерики реализованы в java с использованием метода стирания типа вызова, и вот как это работает.

  1. Замените все параметры типа в универсальных типах их границами или Object, если параметры типа не ограничены. Таким образом, созданный байт-код содержит только обычные классы, интерфейсы и методы.
  2. Вставьте приведения типов, если это необходимо для сохранения безопасности типов.
  3. Создавайте промежуточные методы для сохранения полиморфизма в расширенных универсальных типах.

Итак, если у меня есть общий класс, скажите Container, как показано ниже:

class Container<T>{
T initialValue;
List<T> valueList=new ArrayList<T>();
public List<T> getValueList(){
  return valueList;
}

}

его эквивалентный класс будет выглядеть после обработки стиранием типа:

class Container{
    Object initialValue;
    List valueList=new ArrayList();
    public List getValueList(){
      return valueList;
    }

    }

Поправьте меня, если здесь не так

Точно так же, если изменить вышеуказанный класс, как показано ниже

class Container<T>{
    T initialValue;
    List<T> valueList=new ArrayList<T>();
    T[] arrayValue;
    public Container(T[] array){
       arrayValue=array;
     }
    public List<T> getValueList(){
      return valueList;
    }

    }

не будет ли это эквивалентно???

class Container{
    Object initialValue;
    List valueList=new ArrayList();
    Object[] arrayValue;
    public Container(Object[] array){
       arrayValue=array;
     }
    public List getValueList(){
      return valueList;
    }

    }

если это так, то у меня также должно быть так: T[] arrayValue=new T[10];//Ошибка времени компиляции; поскольку приведенное выше утверждение будет преобразовано в

Object[] arrayValue=new Object[10];

Нужна ясность в том, как стирание типов работает для массивов в Java??


person Sudhir Kumar    schedule 22.05.2016    source источник
comment
Какую ошибку вы видите, с каким кодом, в частности? Не совсем понятно, что вы спрашиваете.   -  person pvg    schedule 22.05.2016
comment
почему T[] arrayValue=new T[10]; не допускается. Почему мы не можем создать массив Object параметризованного типа.   -  person Sudhir Kumar    schedule 22.05.2016


Ответы (1)


Вы не можете создавать общие массивы. Причина в том, что массивы предшествуют дженерикам Java, а массивы не используют стирание типов. Так, например, Integer[] и String[] действительно имеют разные типы во время выполнения. Если вы пишете new T[], компилятор не знает, какой массив ему нужно создать.

Вы можете создать поддельный общий массив, выполнив:

T[] array = (T[]) new Object[10];

Но вы должны помнить, что вы действительно создали массив Object, а не массив T. Во время выполнения в него можно поместить не-T экземпляры, поэтому делайте это только в том случае, если массив является частным полем вашего класса, которое никогда не передается другим объектам, чтобы вы могли точно контролировать, какие объекты помещаются в массив. множество.

Если у вас есть экземпляр Class<T> (так называемый токен типа), вы можете использовать Array.newInstance для создания нового массива с правильным типом времени выполнения:

T[] array = (T[]) Array.newInstance(typeToken, 10); 
person Hoopje    schedule 22.05.2016
comment
Нет, стирание типа не работает с массивами. Во время выполнения List<Integer> и List<String> имеют один и тот же тип, а именно List, но Integer[] и String[] имеют разные типы. - person Hoopje; 22.05.2016