java - List<Double> 是 List< 的子类型吗? extends Number> 为什么?

标签 java extends subtype

这是我知道的:

  1. DoubleNumber 的子类型和 List<Double>不是 List<Number> 的子类型.
  2. List<Dog>不是 List<Animal> 的子类型因为你可以添加 CatList<Animal>但你不能用 List<Dog> 做到这一点.
  3. List<? extends Number>意味着这个列表可以存储 Number 类型的变量和 Number 子类型的变量。 List<Double>意味着这个列表可以存储 Double 类型的变量。

如果上面有什么不对请指正然后是List<Double> List<? extends Number> 的子类型为什么?

最佳答案

你所有的项目都是正确的。

  1. Double is a subtype of Number and List<Double> is not a subtype of List<Number>.

  2. List<Dog> is not a subtype of List<Animal> because you can add Cat to List<Animal> but you can't do that with List<Dog>.

没错。泛型不是协变的(但数组是!)。这是一些后续阅读:Why are arrays covariant but generics are invariant?

  1. List<? extends Number> means this list can store variables of type Number and variables of subtype of Number. List<Double> means this list can store variables of type Double.

这是对的,但是 List<Number> 之间有一个重要的区别和 List<? extends Number> .你可以想到List<? extends Number>作为特定 Number 的列表-subtype(即 List<Double>List<Integer>List<Long> 、...之一)和 List<Number>作为可能包含 Double 组合的列表, Integer , ...

关于你的最后一个问题:

Is List<Double> a subtype of List<? extends Number>...

是的,你可以有例如

List<Double> doubles = new ArrayList<>();
List<? extends Number> numbers = doubles;

... and why?

这就是定义子类型的方式。

至于动机,假设您有一个接受数字列表的方法。如果让参数的类型为 List<Number>你将无法通过 List<Double>给它。 (问题中的第二项解释了原因!)相反,您可以让参数的类型为 List<? extends Number> .自 List<Double>List<? extends Number> 的子类型它会成功的。

关于java - List<Double> 是 List< 的子类型吗? extends Number> 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30498190/

相关文章:

java - 是否有推荐的方法让 Spring 2.5+ Autowiring Hibernate 域对象

java - java swing 中的 jbutton(浏览 pc 文件夹)

java - Solr 导入命令不起作用

java - 扩展类并使变量可变

scala - 将类限制为 Scala 中的特征和结构子类型

java - java新手,面板未在我的卡片布局中切换

JavaScript - 类在条件下扩展

php - 在数据库中保存 morphOne 多态

android - 如何在 android 中为子类型加载不同的键盘布局?

inheritance - JPA 多重鉴别器值