为什么java中我们做不到:
List<List<? extends Number>> aList = new ArrayList<List<Number>>();
Run Code Online (Sandbox Code Playgroud)
即使这样也可以:
List<? extends Number> aList = new ArrayList<Number>();
Run Code Online (Sandbox Code Playgroud)
编译器错误消息是:
Type mismatch: cannot convert from ArrayList<List<Number>> to List<List<? extends Number>>
Joh*_*lla 73
在Java中,如果Car是派生类Vehicle,那么我们可以将所有Cars视为Vehicles; a Car是一个Vehicle.然而,一个List的Cars不也是List的Vehicles.我们说List<Car>的不是协变有List<Vehicle>.
Java要求您在使用由?令牌表示的通配符的协方差和逆变时明确告诉它.看看你的问题发生在哪里:
List<List<? extends Number>> l = new ArrayList<List<Number>>();
// ---------------- ------
//
// "? extends Number" matched by "Number". Success!
Run Code Online (Sandbox Code Playgroud)
内部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.
Run Code Online (Sandbox Code Playgroud)
但是,组合的内部类型参数List<? extends Number>不匹配List<Number>; 类型必须完全相同.另一个通配符将告诉Java这个组合类型也应该是协变的:
List<? extends List<? extends Number>> l = new ArrayList<List<Number>>();
Run Code Online (Sandbox Code Playgroud)