Я читал книгу «Java Generics and Collections» Мориса Нафталина, Филипа Вадлера, и в первых двух главах у меня закружилась голова от сомнений. Я не смог разобраться в ответах.
При вызове:
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-й параметр: ?=Integer
Но какой тип данных у T? Как решается jvm на основе реализации стирания?
В книге сказано, что: В строке Collections.copy(obj,ints)параметр типа T принимается равным Number. Вызов разрешен, поскольку objsимеет тип List
Но поскольку Integer реализует Serializable и Comparable как Serializable, так и Comparable, кроме расширения класса Number и класса Object, он также является супертипом Serializable и Comparable.
Так почему бы не взять T как Serializable или Comparable вместо Number, потому что принцип подстановки позволяет принять его.
Заранее спасибо.