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

发布于 2021-01-29 20:35:11

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

那么两者之间有什么区别?

HashMap<String, ?> hash1;

HashMap<String, Object> hash2;
关注者
0
被浏览
130
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    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) {
        ...
    }
    

    顺便说一句:当您想了解Java中不那么简单的内容时,Joshua Bloch的Effective Java是很好的资源。(您的上述问题也在书中很好地涵盖了。)



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看