Я читал книгу «Дженерики и коллекции Явы» Мориса Нафталина, Филиппа Уодлера, и в первых двух главах у меня кончились сомнения. Я не смог выяснить ответы.
При звонке:
public static <T> void copy(List<? super T> dst, List<? extends T> src) {
for (int i = 0; i < src.size(); i++) {
dst.set(i, src.get(i));
}
}
List<Object> objs = Arrays.<Object>asList(2, 3.14, "four");
List<Integer> ints = Arrays.asList(5, 6);
Collections.copy(objs, ints);
assert objs.toString().equals("[5, 6, four]");
Во время вызова функции «Копировать»:
1-й параметр:? = Объект
2-й параметр:? = Целое число
Но каков тип данных T? Как это решает jvm на основе реализации стирания?
В книге сказано, что: В строке Collections.copy (obj, ints) параметр типа T принимается за Number. Вызов разрешен, потому что objs имеет тип List , который является подтипом List <? super Number> (поскольку Object является супертипом Number, как того требует супер), а ints имеет тип List , который является подтипом List <? extends Number> (поскольку Integer является подтипом Number, как того требует подстановочный знак extends).
Но поскольку Integer реализует и Serializable, и Comparable, aprt из расширяющегося класса Number и класса Object также является супертипом Serializable и Comparable.
Так почему бы и нет, чтобы T воспринимался как Сериализуемый или Сравнимый вместо Числа, потому что Принцип Подстановки позволит его использовать.
Заранее спасибо.