我正在使用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).

示例: 如果您想要编写一个接受ListInputStream和子类型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.)

Java相关问答推荐

Maven Google Sheets版本问题

gitlab ci不会运行我的脚本,因为它需要数据库连接'

方法没有用正确的值填充数组—而是将数组保留为null,'

取消按钮,但没有任何操作方法引发和异常

使用标记时,场景大纲不在多个线程上运行

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

是否在允许数组元素为空时阻止 idea 为空性警告?

在Java Swing Paint应用程序中捕获快速鼠标移动时遇到困难

为什么JAVA&S清洁器使用链表而不是并发HashSet?

解释左移在Java中的工作原理

Spring @Value default无法计算表达式

使用OAuth 2.0资源服务器JWT时的授权(授权)问题

在学习Spring时,通过构造函数参数0表达了不满意的依赖关系

如何创建模块信息类文件并将其添加到JAR中?

Spring Framework6.1中引入的新RestClient是否有适合于测试的变体,就像RestTemplate和TestRestTemplate一样?

项目react 堆中doOnComplete()和Subscribe()的第三个参数之间的差异

视图被推出线性布局-Android

如何以事务方式向ibmmq发送消息

spring 数据Elastic search 与 spring 启动数据Elastic search 之间的区别是什么?

始终使用Spring Boot连接mongodb上的测试数据库