为什么在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>>
在Java中,如果Car
是一个派生类Vehicle
,那么我们可以对待所有Cars
as Vehicles
; a Car
is a Vehicle
. 然而,一个List
of Cars
不也是一个List
of Vehicles
。我们这么说List<Car>
is 非协变 with List<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.
但是,组合的内部类型参数List<? extends Number>
不匹配于List<Number>
;类型必须是完全相同。另一个通配符将告诉 Java 这种组合类型也应该是协变的:
List<? extends List<? extends Number>> l = new ArrayList<List<Number>>();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)