在Java中,如果Car是Vehicle的派生类,那么我们可以将所有Cars作为Vehicle;一辆汽车是一辆车。然而,汽车列表也不是车辆列表。我们说List< Car>不与List< Vehicle>协变。
Java要求你明确告诉它什么时候你想使用协方差和逆变的通配符,代表?令牌。看看你的问题发生的地方:
List> l = new ArrayList>();
// ---------------- ------
//
// "? extends Number" matched by "Number". Success!
内部List< ;? extends Number>因为Number确实扩展了Number,所以它匹配“?extends Number”。到现在为止还挺好。下一步是什么?
List> l = new ArrayList>();
// ---------------------- ------------
//
// "List extends Number>" not matched by "List". 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>();