我正在使用Eclipse来帮助我清理一些代码,以便正确使用Java泛型.大多数情况下,它在推断类型方面做得非常出色,但在某些情况下,推断的类型必须尽可能是泛型的:Object.但是Eclipse似乎给了我一个选项,可以在一种对象类型和一种"?"类型之间进行 Select .
那么,两者之间的区别是什么:
HashMap<String, ?> hash1;
和
HashMap<String, Object> hash2;
我正在使用Eclipse来帮助我清理一些代码,以便正确使用Java泛型.大多数情况下,它在推断类型方面做得非常出色,但在某些情况下,推断的类型必须尽可能是泛型的:Object.但是Eclipse似乎给了我一个选项,可以在一种对象类型和一种"?"类型之间进行 Select .
那么,两者之间的区别是什么:
HashMap<String, ?> hash1;
和
HashMap<String, Object> hash2;
HashMap<String, String>
的实例匹配Map<String, ?>
,但不匹配Map<String, Object>
.假设你想写一个方法,接受从String
到任何东西的映射:如果你想写
public void foobar(Map<String, Object> ms) {
...
}
你不能提供HashMap<String, String>
美元.如果你写信
public void foobar(Map<String, ?> ms) {
...
}
它起作用了!
Java泛型中有时会误解的一件事是,List<String>
不是List<Object>
的子类型.(但是String[]
实际上是Object[]
的子类型,这是泛型和数组不能很好混合的原因之一.(Java中的数组是协变的,泛型不是协变的,它们是invariant).
示例:
如果您想要编写一个接受List
个InputStream
和子类型InputStream
的方法,您可以编写
public void foobar(List<? extends InputStream> ms) {
...
}
By the way: Joshua Bloch's Effective Java is an excellent resource when you'd like to understand the not so simple things in Java. (Your question above is also covered very well in the book.)