Как определяется тип данных параметра типа в ковариантности и контравариантности?

Я читал книгу «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, который является подтипом List (поскольку Object является супертипом Number, как того требует super), а intsимеет тип List, который является подтипом List (поскольку Integer является подтипом Number, как того требует подстановочный знак extends).

Но поскольку Integer реализует Serializable и Comparable как Serializable, так и Comparable, кроме расширения класса Number и класса Object, он также является супертипом Serializable и Comparable.

Так почему бы не взять T как Serializable или Comparable вместо Number, потому что принцип подстановки позволяет принять его.

Заранее спасибо.

5
задан Dipesh Gupta 23 March 2012 в 08:51
поделиться