我正在使用Eclipse来帮助我清理一些代码以正确使用Java泛型。大多数时候,它在推断类型方面做得非常出色,但是在某些情况下,推断类型必须尽可能地通用:对象。但是Eclipse似乎给了我一个选择,可以选择对象类型还是“?”类型。
那么之间有什么区别:
HashMap<String, ?> hash1;
和
HashMap<String, Object> hash2;
HashMap<String, String>匹配项的实例,Map<String, ?>但不是Map<String, Object>。假设你要编写一个接受Strings到任何内容的映射的方法:如果你要编写
HashMap<String, String>
Map<String, ?>
Map<String, Object>
Strings
public void foobar(Map<String, Object> ms) { ... }
你无法提供HashMap<String, String>。如果你写
public void foobar(Map<String, ?> ms) { ... }
有用!
在Java泛型中有时会被误解的一件事是它List<String>不是的子类型List<Object>。(但String[]实际上是的子类型Object[],这是泛型和数组不能很好混合的原因之一。(Java中的数组是协变的,泛型不是,它们是不变的))。
List<String>
List<Object>
String[]
Object[]
示例:如果你想编写一个接受List的的的InputStreams和的子类型的方法InputStream,则可以编写
List
InputStreams
public void foobar(List<? extends InputStream> ms) { ... }