Центр дистанционного обучения
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