泛型类型比较古怪。
<? extendsNumber>表示Number或未知的子类。如果获得这样的值,它将是
Number,但是由于您不知道哪个有效,因此无法给出此类型的值。
区别在于参数和返回值。
List<Number> numbers = new ArrayList<Number>();Number n = 1;numbers.add(n); // ok.n = numbers.get(0); // oknumbers.add(1); // ok.List<? extends Number> numbers2 = new ArrayList<Double>();numbers2.add(n); // not okn = numbers2.get(0); // okList<? super Number> numbers3 = new ArrayList<Serializable>();numbers3.add(n); // okn = numbers3.get(0); // not ok.
super在一些地方用来表示类型可以是超级类型。例如
在集合中,此方法表示比较器需要能够比较相同类型或任何超级类型。
public static <T> void sort(List<T> list, Comparator<? super T> c)
这意味着你可以
Comparator<Number> comparesAnyNumbers = ...List<Integer> ints = ...Collections.sort(ints, comparesAnyNumbers);



