Добавил:
Rumpelstilzchen2018@yandex.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3-й семестр / Лекции / 6 - Презентация 2 - Дженерики, Абстрактные типы данных, Стек

.pdf
Скачиваний:
57
Добавлен:
25.12.2020
Размер:
879.76 Кб
Скачать

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

Лекция 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