List&lt; Number&gt;之间的区别是什么?和列表<?扩展数字&gt ;? [英] What is the difference between List&lt;Number&gt; and List&lt;? extends Number&gt;?

查看:386
本文介绍了List&lt; Number&gt;之间的区别是什么?和列表<?扩展数字&gt ;?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个非常基本的问题,那就是 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 来表示该类型可以是超类型。例如



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

  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&lt; Number&gt;之间的区别是什么?和列表<?扩展数字&gt ;?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆