为了解决非协变特性带来的问题,Java提供了wildcard(?),分为3种.
1. upper bounded wildcard. 例如List<? extends Number>. 兼容Number及其子类的List.
2. unbounded wildcard. 例如List<?>. 兼容所有类型的List.
3. lower bounded wildcard 例如List<? supper Integer>,兼容所有Integer及其父类的List.
wildcard的含义是unknown type.所以,List<?>可以看做是一个read-only的集合,只能向其插入null值.因为它的元素类型是未知的,以至于连Object类型元素都不能插入.
需要注意的是,不要使用?作为返回类型,这会导致调用者进行非常危险cast操作!
加上了unbounded wildcard特性后,能够得到以下的继承关系图.