List< Number>之间的区别是什么?和列表<?扩展数字> ;? [英] What is the difference between List<Number> and List<? extends Number>?
问题描述
我有一个非常基本的问题,那就是 Java泛型。我认为 List< Number>
和 List< ;? extends Number>
是同类的。我是对的,还是有一些基本的东西我缺少? 通用类型更迂腐。
<? extends Number>
表示数字或未知的子类。如果你获得这样一个值,它将是一个 Number
,但是你不能给出这个类型的值,因为你不知道哪一个是有效的。
差异在参数和返回值中。
List<数> numbers = new ArrayList< Number>();
数字n = 1;
numbers.add(n); // 好。
n = numbers.get(0); //好的
numbers.add(1); // 好。
列表< ;?扩展Number> numbers2 = new ArrayList< Double>();
numbers2.add(n); //不行
n = numbers2.get(0); //好的
列表< ;?超级号码> numbers3 = new ArrayList< Serializable>();
numbers3.add(n); // ok
n = numbers3.get(0); // 不好。
super $在几个地方使用c $ c>来表示该类型可以是超类型。例如
在集合中,此方法表示比较器需要能够比较相同类型或任何超类型。
public static< T> void sort(List< T> list,Comparator< ;? super T> c)
这意味着你可以有
比较器<数字>比较所有数字= ...
列表<整数> ints = ...
Collections.sort(ints,comparisonAnyNumbers);
I have a very basic question ragarding Java generics . I thought that both List<Number>
and List<? extends Number>
are homogeneous . Am I right or is there something fundamental I am missing ?
Generic types are more pedantic.
<? extends Number>
means Number or an unknown a sub class. If you obtain such a value it will be a Number
, but you cannot give a value of this type because you don't know which is valid.
The difference is in arguments and return values.
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.
super
is used in a few places to signify the type can be a super type. e.g.
In Collections, this method says the Comparator needs to be able to compare the same type or any super type.
public static <T> void sort(List<T> list, Comparator<? super T> c)
This means you can have
Comparator<Number> comparesAnyNumbers = ...
List<Integer> ints = ...
Collections.sort(ints, comparesAnyNumbers);
这篇关于List< Number>之间的区别是什么?和列表<?扩展数字> ;?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!