Материал: 6 - Презентация 2 - Дженерики, Абстрактные типы данных, Стек

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Центр дистанционного обучения

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

Источник: https://studfile.net/preview/16403810/