Java通用列表<List <?扩展数>>

39 java generics

为什么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.然而,一个ListCars不也是ListVehicles.我们说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)

  • 实际上是示例性解释.+1 (7认同)

eul*_*rfx 3

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

协变与逆变