3-й семестр / Лекции / 6 - Презентация 2 - Дженерики, Абстрактные типы данных, Стек
.pdfЦентр дистанционного обучения
Лекция 6 Программирование на
Java
ФИО преподавателя: Зорина Наталья Валентиновна e-mail: zorina@mirea.ru,zorina_n@mail.ru
Online-edu.mirea.ru
online.mirea.ru
Центр дистанционного обучения
Generics
public class StringList { int size();
String get(int index); void add(String element);
}
online.mirea.ru
Центр дистанционного обучения
Generics
public class IntList { int size();
int get(int index); void add(int element);
}
online.mirea.ru
Центр дистанционного обучения
Generics
Проблема 1: код StringList и IntList практически идентичен с точностью до замены String на int. Хотелось бы избежать copy/paste.
online.mirea.ru
Центр дистанционного обучения
Generics
Проблема 2: невозможно написать код, работающий с любым списком:
static String listToString(XXXList list) {
StringBuilder buf = new StringBuilder(); for (int i = 0; i < list.size(); i++) {
buf.append(list.get(i)).append(“ ”);
}
return buf.toString();
}
online.mirea.ru
Центр дистанционного обучения
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