Центр дистанционного обучения
Generics
Объявление “class AnyList<E>” – это объявление “заготовки” типа, а конкретный тип AnyList<Integer> устанавливает параметр E=Integer. Поэтому метод get для AnyList<Integer>
возвращает тип Integer.
Синтаксически это похоже на C++ templates, но реализовано по-другому, что имеет последствия при использовании generics в программах.
online.mirea.ru
Центр дистанционного обучения
Generics – type erasure
Пример:
public class AnyBox<E> { private E value = null;
public E get() { return value; }
public void set(E newValue) { value = newValue; }
}
online.mirea.ru
Центр дистанционного обучения
Generics – type erasure
public class AnyBox<E> { private E value = null; public E get() {
return value;
}
public void set(E newValue) {
value = newValue;
}
}
AnyBox<String> box = new AnyBox<>();
box.set(“Some string”);
String boxValue = box.get();
public class AnyBox {
private Object value = null; public Object get() {
return value;
}
public void set(Object newValue) {
value = newValue;
}
}
AnyBox box = new AnyBox(); box.set(“Some string”);
String boxValue = (String) box.get();
//Здесь система типов гарантирует,
//что ClassCastException не произойдет
//(но см. ссылку)
online.mirea.ru
Центр дистанционного обучения
Generics – type erasure
Таким образом, класс AnyBox существует в единственном экземпляре, AnyBox<String> и AnyBox<Integer> при выполнении программы являются одним и тем же классом AnyBox (который называется raw class). Одно из следствий:
public class AnyBox<E> { void set(E newValue);
void set(Object newObject);
}
не скомпилируется, т.к. в raw-классе эти методы будут иметь одну и ту же сигнатуру.
online.mirea.ru
Центр дистанционного обучения
Generics – type erasure
Другие ограничения, вызванные type erasure:
•нельзя написать new E() (потому что это было бы транслировано в new Object())
•нельзя написать new E[size] (потому что это было бы транслировано в new Object[size])
Типовые параметры существуют исключительно во время компиляции программы.
online.mirea.ru