2016-05-22 5 views
0

Оракул doc говорит, что дженерики реализованы в java, используя стирание типа метода, и так оно и работает.Стирание стилей Java и массивы

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

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

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 ??

+0

Что такое ошибка, которую вы видите, с какой код, в частности? Не совсем понятно, что вы спрашиваете. – pvg

+0

почему T [] arrayValue = new T [10]; не допускается. Почему мы не можем создать массив Object с параметризованным типом. –

ответ

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); 
+0

Итак, тип стирания не работает с массивами ?? –

+0

Нет, стирание типа не работает с массивами.Во время выполнения «Список » и «Список » имеют один и тот же тип, а именно «List», но «Integer []» и «String []' имеют * разные * типы. – Hoopje

Смежные вопросы