Java Generic List<List<?扩展数字>>

2022-09-01 03:38:12

为什么在Java中我们不能这样做:

List<List<? extends Number>> aList = new ArrayList<List<Number>>();

即使这是可以的:

List<? extends Number> aList = new ArrayList<Number>();

编译器错误消息为:

Type mismatch: cannot convert from ArrayList<List<Number>> to List<List<? extends Number>>


答案 1

在 Java 中,如果 是 的派生类,那么我们可以将所有视为 ;a 是 .但是,汽车列表也不是车辆列表。我们说List<Car>List<Vehicle>不协变CarVehicleCarsVehiclesCarVehicle

Java 要求您明确告诉它何时要使用协方差和逆变以及通配符(由令牌表示)。看看你的问题发生在哪里:?

List<List<? extends Number>> l = new ArrayList<List<Number>>();
//        ----------------                          ------
// 
// "? extends Number" matched by "Number". Success!

内部工作,因为确实扩展,所以它匹配“”。目前为止,一切都好。下一步是什么?List<? extends Number>NumberNumber? extends Number

List<List<? extends Number>> l = new ArrayList<List<Number>>();
//   ----------------------                    ------------
// 
// "List<? extends Number>" not matched by "List<Number>". These are
//   different types and covariance is not specified with a wildcard.
//   Failure.

但是,组合的内部类型参数与 ;类型必须完全相同。另一个通配符将告诉Java,这个组合类型也应该是协变的:List<? extends Number>List<Number>

List<? extends List<? extends Number>> l = new ArrayList<List<Number>>();

答案 2

我不是很熟悉Java语法,但似乎你的问题是这样的:

协方差和逆方差


推荐