List <Number>和List <有什么区别?扩展数>?

Gee*_*eek 9 java generics

我有一个关于Java泛型的非常基本的问题.我想这两个List<Number>List<? extends Number>是同质的.我是对的还是有一些我缺少的基础?

Pet*_*rey 7

泛型类型更迂腐.

<? extends Number>表示数字或未知的子类.如果你获得这样的值,它将是a Number,但你不能给出这种类型的值,因为你不知道哪个是有效的.

不同之处在于参数和返回值.

List<Number> numbers = new ArrayList<Number>();
Number n = 1;
numbers.add(n); // ok.
n = numbers.get(0); // ok
numbers.add(1); // ok.

List<? extends Number> numbers2 = new ArrayList<Double>();
numbers2.add(n); // not ok
n = numbers2.get(0); // ok

List<? super Number> numbers3 = new ArrayList<Serializable>();
numbers3.add(n); // ok
n = numbers3.get(0); // not ok.
Run Code Online (Sandbox Code Playgroud)

super用于表示类型的几个地方可以是超类型.例如

在集合中,此方法表示比较器需要能够比较相同类型或任何超类型.

public static <T> void sort(List<T> list, Comparator<? super T> c)
Run Code Online (Sandbox Code Playgroud)

这意味着你可以拥有

Comparator<Number> comparesAnyNumbers = ...
List<Integer> ints = ...
Collections.sort(ints, comparesAnyNumbers);
Run Code Online (Sandbox Code Playgroud)