java - 通用 Map.entrySet() 的返回类型

标签 java generics

Map.entrySet() 声明为:

Set<Map.Entry<K, V>> entrySet();

我在某个地方定义了一个这样的变量:

Map<? extends Number, String> wildCardMap = new HashMap<>();

现在,我假设类型参数 K 是 ?扩展 Number,我可以这样做:

Set<Map.Entry<? extends Number, String>> entries = wildCardMap.entrySet();

但这会产生编译错误,我必须写:

Set<? extends Map.Entry<? extends Number, String>> entries = wildCardMap.entrySet();

有人可以解释一下为什么在 Map.Entry 之前需要通配符吗?

最佳答案

通配符? extends Number表示扩展 Number 的某些特定(我们未知)类型。因此,让我们尝试一种可能的类型,Integer ,看看会发生什么:

Map<Integer, String> wildCardMap;

// doesn't compile
Set<Map.Entry<? extends Number, String>> entries = wildCardMap.entrySet();
为什么?因为wildCardMap.entrySet()返回Set<Map.Entry<Integer, String>> ,它不是 Set<Map.Entry<? extends Number, String>> 的子类型.

泛型是不变的,类型参数必须完全匹配,除非类型参数是通配符。更深层次的通配符不算数(它只是类型的一部分)。 Set<Map.Entry<Integer, String>>不是 Set<Map.Entry<? extends Number, String>> 的子类型,尽管 Map.Entry<Integer, String>Map.Entry<? extends Number, String> 的子类型,就像 List<String> 一样不是 List<Object> 的子类型即使StringObject 的子类型.

关于java - 通用 Map.entrySet() 的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36779497/

相关文章:

java - 使用泛型匹配参数和返回类型

java - 在数组中查找重复数字时出现问题,是我的技术不好吗?

java - 将字符串添加到列表 <Integer>

java - 如何在接口(interface)处编写通用方法参数

java - 摆脱 Unchecked 覆盖 : return type requires unchecked conversion

c# - List<T> 实例之间的关系

java - 在带有 JDBC 驱动程序的 Java 中使用准备好的语句和变量绑定(bind) Order By

java - hibernate composite 主键包含一个复合外键,如何映射这个

java - 用于 Java 桌面应用程序的 MVC

Java泛型结合接口(interface)继承