Центр дистанционного обучения
Generics
Первое решение проблемы – использовать Object:
public class AnyList {
int size();
Object get(int index);
void add(Object element);
}
AnyList list = new AnyList(); list.add(“String”);
String e = (String) list.get(0);
online.mirea.ru
Центр дистанционного обучения
Generics
Тип int не является классом, соответственно он не наследуется от Object. Для преодоления этой проблемы в Java для каждого примитивного типа есть соответствующий класс-обертка:
•int – Integer
•long – Long
•byte – Byte
•short – Short
•char – Character
•float – Float
•double – Double
•boolean – Boolean
online.mirea.ru
Центр дистанционного обучения
Generics
При этом преобразование может осуществляться автоматически.
int i = 42;
Integer intBox = Integer.valueOf(i); // ручной boxing
Integer intBox = i; // автоматический boxing
int j = intBox.intValue(); // ручной unboxing
int j = intBox; // автоматический unboxing
Автоматический unboxing потенциально небезопасен, если intBox имеет значение null.
online.mirea.ru
Центр дистанционного обучения
Generics
У решения с Object есть также две проблемы:
•приходится добавлять приведение типа при каждом обращении к get:
String e = (String) list.get(0);
•возможно случайно вызвать ClassCastException: AnyList list = new AnyList();
list.add(“Text element”);
...
int intValue = (Integer) list.get(0); // ClassCastException
online.mirea.ru
Центр дистанционного обучения
Generics
Более полное решение – добавление в систему типов generics:
public class AnyList<E> { int size();
E get(int index); void add(E element);
}
AnyList<Integer> list = new AnyList<>();
Integer element = list.get(0); // Уже не нужно приведение
online.mirea.ru