我正在使用Eclipse来帮助我清理一些代码,以便正确地使用Java泛型。大多数时候,它在推断类型方面做得很好,但在某些情况下,推断的类型必须是尽可能通用的: Object。但是Eclipse似乎给了我一个在一种对象类型和一种“?”类型之间进行选择的选项。
那么它们之间的区别是什么呢?
HashMap<String, ?> hash1;
和
HashMap<String, Object> hash2;
发布于 2009-03-24 19:22:18
如果您还记得,Collection<Object>
只是一个包含Object
类型的对象的泛型集合,那么就很容易理解,但Collection<?>
是所有类型集合的超类型。
发布于 2014-11-26 19:00:05
上面的协方差答案涵盖了大多数情况,但遗漏了一件事:
"?“在类层次结构中包含"Object“。您可以说String是一种对象类型,而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
发布于 2009-03-24 19:20:28
您不能安全地将任何内容放入Map<String, ?>
,因为您不知道这些值应该是什么类型。
您可以将任何对象放入Map<String, Object>
中,因为已知值为Object
。
https://stackoverflow.com/questions/678822
复制相似问题