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

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

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

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

Generics – type erasure

Но почему не разрешить скопировать содержимое AnyBox<String> в AnyBox<Object>, который может хранить и строки тоже?

public class BoxUtil {

static <E> void copyBox(AnyBox<E> to, AnyBox<? extends E> from) { E value = from.get();

to.set(value);

}

}

AnyBox<Object> to = new AnyBox<>();

AnyBox<String> from = new AnyBox<>();

BoxUtil.copyBox(to, from);

online.mirea.ru

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

Generics – type erasure

Альтернативный вариант:

public class BoxUtil {

static <T, F extends T> void copyBox(AnyBox<T> to, AnyBox<F> from) {

F value = from.get();

to.set(value);

}

}

AnyBox<Object> to = new AnyBox<>();

AnyBox<String> from = new AnyBox<>();

BoxUtil.copyBox(to, from);

online.mirea.ru

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

Generics – type erasure

Еще один альтернативный вариант:

public class BoxUtil {

static <E> void copyBox(AnyBox<? super E> to, AnyBox<E> from) {

E value = from.get();

to.set(value);

}

}

AnyBox<Object> to = new AnyBox<>();

AnyBox<String> from = new AnyBox<>();

// “Object super String” – выполняется, Object – предок String:

BoxUtil.copyBox(to, from);

online.mirea.ru

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

Generics – type erasure

Java Generics FAQ:

http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

online.mirea.ru

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

Generics – дизайн Comparable

public interface Comparable {

int compareTo(Object other);

}

public class String implements Comparable { public int compareTo(Object other) {

String otherStr = (String) other;

... // сравнение строк

}

}

online.mirea.ru

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

Generics – дизайн Comparable

String str = “ABC”;

Integer i = 42;

int cmp = str.compareTo(i); // ClassCastException

online.mirea.ru

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

Generics – дизайн Comparable

public interface Comparable<T> {

int compareTo(T other);

}

public class String implements Comparable<String> { public int compareTo(String otherStr) {

... // сравниваем строки

}

}

online.mirea.ru

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

Generics – дизайн Comparable

public class ArraySort {

static <E> void sort(E[] array) {

...

if (array[i].compareTo(array[i + 1]) > 0) {

...

}

...

}

}

online.mirea.ru

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

Generics – дизайн Comparable

public class ArraySort {

static <E extends Comparable<...>> void sort(E[] array) {

...

if (array[i].compareTo(array[i + 1]) > 0) {

...

}

тип E

...

}

}

online.mirea.ru

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

Generics – дизайн Comparable

public class ArraySort {

static <E extends Comparable<E>> void sort(E[] array) {

...

if (array[i].compareTo(array[i + 1]) > 0) {

...

}

...

}

}

online.mirea.ru