java - List<Number> 和 List< 有什么区别?扩展号码>?

标签 java generics

我有一个关于 Java generics 的非常基本的问题。我认为 List<Number>List<? extends Number>是同质的。我是对的还是缺少一些基本的东西?

最佳答案

泛型更迂腐。

<? extends Number>表示数字或未知的子类。如果您获得这样的值,它将是 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.

super在一些地方使用来表示类型可以是父类(super class)型。例如

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

public static <T> void sort(List<T> list, Comparator<? super T> c)

这意味着你可以拥有

Comparator<Number> comparesAnyNumbers = ...
List<Integer> ints = ...
Collections.sort(ints, comparesAnyNumbers);

关于java - List<Number> 和 List< 有什么区别?扩展号码>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12216326/

相关文章:

java - 如何在另一个 Jenkins 声明性管道阶段使用 mvn package 生成的 Jar?

c# - C# 中泛型类型的缺点

java - 如何处理以下覆盖率扫描问题参数 docId 接收受污染的数据 (taint_path_param)

java - 如何在初始化后将Java对象设置为final

java - 如何将带有条件的 for 迭代转换为 Java 8 流

c++ - 如何从内联模板方法返回通用 vector 迭代器?

swift - 如何在任意抽象层中使用泛型?

java - MVC 中 View 与模型的通信如何发生

Scala:通配符(类型参数)和集合的编译错误: "you may wish to investigate a wildcard type as"

swift - 如何将 Realm 通知抽象为带有闭包的通用结构?