В документе оракула говорится, что дженерики реализованы в java с использованием метода стирания типа вызова, и вот как это работает.
- Замените все параметры типа в универсальных типах их границами или Object, если параметры типа не ограничены. Таким образом, созданный байт-код содержит только обычные классы, интерфейсы и методы.
- Вставьте приведения типов, если это необходимо для сохранения безопасности типов.
- Создавайте промежуточные методы для сохранения полиморфизма в расширенных универсальных типах.
Итак, если у меня есть общий класс, скажите 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??