3 回答

TA贡献1893条经验 获得超10个赞
考虑这个问题的另一种方法是
HashMap<String, ?> hash1;
相当于
HashMap<String, ? extends Object> hash1;
将此知识与Java Generics and Collections的第(2.4)节中的“获取和放置原理”相结合:
获取和放置原则:仅从结构中获取值时使用扩展通配符,仅将值放入结构中时使用超级通配符,获取和放置时均不使用通配符。
希望可以开始使用通配符。

TA贡献2019条经验 获得超9个赞
协方差以上的答案涵盖了大多数情况,但缺少一件事:
“?” 在类层次结构中包含“对象”。您可以说String是Object的一种,而Object是?的一种。并非所有对象都匹配Object,但是所有对象都匹配?。
int test1(List<?> l) {
return l.size();
}
int test2(List<Object> l) {
return l.size();
}
List<?> l1 = Lists.newArrayList();
List<Object> l2 = Lists.newArrayList();
test1(l1); // compiles because any list will work
test1(l2); // compiles because any list will work
test2(l1); // fails because a ? might not be an Object
test2(l2); // compiled because Object matches Object
添加回答
举报