Центр дистанционного обучения
Generics – type erasure
Методы тоже могут быть generic:
public class BoxUtil { // класс – не generic
static <E> void clear(AnyBox<E> box) {
box.set(null);
}
}
AnyBox<String> box = ...;
// обычно компилятор определяет параметр E автоматически:
BoxUtil.clear(box);
// Но если нужно, можно указать вручную:
BoxUtil.<String>clear(box);
online.mirea.ru
Центр дистанционного обучения
Generics – type erasure
Для типовых параметров могут быть указаны ограничения:
public class BoxUtil {
static <E extends Runnable> void runBox(AnyBox<E> box) {
E runnable = box.get(); // гарантируется, что E наследуется от Runnable
runnable.run();
}
}
BoxUtil.runBox(new AnyBox<String>()); // ошибка, String – не Runnable
BoxUtil.runBox(new AnyBox<Runnable>()); // компилируется
online.mirea.ru
Центр дистанционного обучения
Generics – type erasure
Иногда нам не важно значение типового параметра (wildcard):
public class BoxUtil {
static void clearBox(AnyBox<?> box) {
box.set(null);
}
}
BoxUtil.clearBox(new AnyBox<String>());
BoxUtil.clearBox(new AnyBox<Integer>());
online.mirea.ru
Центр дистанционного обучения
Generics – type erasure
Для ? тоже могут быть указаны ограничения:
public class BoxUtil {
static void runBox(AnyBox<? extends Runnable> box) {
Runnable runnable = box.get();
runnable.run();
}
}
BoxUtil.runBox(new AnyBox<String>()); // ошибка, String – не Runnable
BoxUtil.runBox(new AnyBox<Runnable>()); // компилируется
online.mirea.ru
Центр дистанционного обучения
Generics – type erasure
public class BoxUtil {
static <E> void copyBox(AnyBox<E> to, AnyBox<E> from) {
E value = from.get();
to.set(value);
}
}
AnyBox<String> to = new AnyBox<>();
AnyBox<String> from = new AnyBox<>();
// здесь важно, что у to и from один и тот же параметр E:
BoxUtil.copyBox(to, from);
online.mirea.ru