带有 ArrayList 通配符的 Java HashMap

标签 java generics arraylist hashmap wildcard

我有一个 HashMap,其中的值是 ArrayList,我正在尝试编写一个函数来接受这些 HashMap 的通用实例

HashMap<String, ArrayList<Integer>> myMap = new HashMap<String, ArrayList<Integer>>();
public static void foo(HashMap<?, ArrayList<?>> a) {}
public static void bar(HashMap<?, ? extends ArrayList<?>> a) {}

// Compilation Failure!
foo(myMap);

// This works, but why do I need ? extends ArrayList
bar(myMap)

错误信息是

The method foo(HashMap<?,ArrayList<?>>) in the type Example is not applicable for the arguments (HashMap<String,ArrayList<Integer>>).

为什么我需要为扩展 ArrayList 使用通配符?

我认为通过 ArrayList<?> (没有 ? extends ),我可以将函数限制为仅具有 ArrayList 值的 HashMap。

我也知道以下通用方法有效:

public static <K,V> void printer(HashMap<K, ArrayList<V>> list) { }

这和我想的一样ArrayList<?>会工作。有人可以解释这里的微妙之处吗?

最佳答案

通配符语法是故意设计来(误)引导人们相信它匹配任何类型。这适用于简单的情况

List<?> <= List<String> // OK, right is subtype of left

但请记住,它只适用于第一层,而不是更深的

List<List<?> <= List<List<String>>  // FAIL

这很好

List<? extends List<?>> <= List<List<String>>

因为新的一级 ? . 如果ST 的子类型, G<S>G<? extends T> 的子类型.适用于 S=List<String> 的情况, T=List<?> .

关于带有 ArrayList 通配符的 Java HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6603146/

相关文章:

java - 使用自定义类加载器的aspectj LTW 的任何指南

java - 如何从抽象类中实现具体具体类的列表?

java - 查找 ArrayList 中点的邻居

java - 如何从firebase数据库检索数据并将所有数据传递给sms

java - 不能在 OnClickListener 上抛出 IOException

java - 不支持的 SignatureMethod 算法,但该算法被 BC-Provider 列为可用服务

java - Java 中的泛型类型转换与参数化类型转换

generics - Java 8 [无法推断类型变量]问题

Php Hack中使用反射获取泛型类型

java - 如何打印ArrayLists的ArrayList,以便将每个内部列表打印在一行上?