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

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

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

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

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