一尘不染

有什么区别?Java泛型中的对象和对象?

java

我正在使用Eclipse来帮助我清理一些代码以正确使用Java泛型。大多数时候,它在推断类型方面做得非常出色,但是在某些情况下,推断类型必须尽可能地通用:对象。但是Eclipse似乎给了我一个选择,可以选择对象类型还是“?”类型。

那么之间有什么区别:

HashMap<String, ?> hash1;

HashMap<String, Object> hash2;

阅读 510

收藏
2020-03-17

共1个答案

一尘不染

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的的的InputStreams和的子类型的方法InputStream,则可以编写

public void foobar(List<? extends InputStream> ms) {
    ...
}
2020-03-17