
3-й семестр / Лекции / 6 - Презентация 2 - Дженерики, Абстрактные типы данных, Стек
.pdf
Центр дистанционного обучения
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