这是我知道的:
-
Double
是Number
的子类型和List<Double>
不是List<Number>
的子类型. -
List<Dog>
不是List<Animal>
的子类型因为你可以添加Cat
至List<Animal>
但你不能用List<Dog>
做到这一点. -
List<? extends Number>
意味着这个列表可以存储 Number 类型的变量和 Number 子类型的变量。List<Double>
意味着这个列表可以存储 Double 类型的变量。
如果上面有什么不对请指正然后是List<Double>
List<? extends Number>
的子类型为什么?
最佳答案
你所有的项目都是正确的。
Double
is a subtype ofNumber
andList<Double>
is not a subtype ofList<Number>
.
List<Dog>
is not a subtype ofList<Animal>
because you can addCat
toList<Animal>
but you can't do that withList<Dog>
.
没错。泛型不是协变的(但数组是!)。这是一些后续阅读:Why are arrays covariant but generics are invariant?
List<? extends Number>
means this list can store variables of typeNumber
and variables of subtype ofNumber
.List<Double>
means this list can store variables of typeDouble
.
这是对的,但是 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 ofList<? 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/