在 Java 中,如果 是 的派生类,那么我们可以将所有视为 ;a 是 .但是,汽车
列表
也不是车辆
列表
。我们说List<Car>
与List<Vehicle>
不协变。Car
Vehicle
Cars
Vehicles
Car
Vehicle
Java 要求您明确告诉它何时要使用协方差和逆变以及通配符(由令牌表示)。看看你的问题发生在哪里:?
List<List<? extends Number>> l = new ArrayList<List<Number>>();
// ---------------- ------
//
// "? extends Number" matched by "Number". Success!
内部工作,因为确实扩展,所以它匹配“”。目前为止,一切都好。下一步是什么?List<? extends Number>
Number
Number
? 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>>();