java - 在 Java Collections Map<Key,?> 中 "?"指的是什么?

标签 java generics collections hashmap

在 Java 集合中我看到了这样的东西:Map<Key,?> . 我不知道它是如何工作的,任何人都可以帮我解决这个问题或提供一个例子吗?

最佳答案

问号 (?) 代表未知类型。

在您的示例中,Map<Key, ?> ,这意味着它将匹配包含任何类型值的映射。它并不意味着您可以创建 Map<Key, ?>并在其中插入任何类型的值。

引自documentation :

In generic code, the question mark (?), called the wildcard, represents an unknown type. The wildcard can be used in a variety of situations: as the type of a parameter, field, or local variable; sometimes as a return type (though it is better programming practice to be more specific). The wildcard is never used as a type argument for a generic method invocation, a generic class instance creation, or a supertype.

例如,假设您要创建一个函数来打印任何 map 的值,而不管值类型:

static void printMapValues(Map<String, ?> myMap) {
    for (Object value : myMap.values()) {
        System.out.print(value + " ");
    }
}

然后通过 Map<String, Integer> 调用此函数作为参数:

Map<String, Integer> myIntMap = new HashMap<>();
myIntMap.put("a", 1);
myIntMap.put("b", 2);
printMapValues(myIntMap);

你会得到:

1 2

通配符允许您通过 Map<String, String> 调用相同的函数 ,或任何其他值类型,作为参数:

Map<String, String> myStrMap = new HashMap<>();
myStrMap.put("a", "one");
myStrMap.put("b", "two");
printMapValues(myStrMap);

结果:

one two

此通配符称为无界,因为它不提供有关类型的信息。在以下几种情况下,您可能需要使用无界通配符:

  • 如果除了在 Object 中定义的那些之外,您没有调用任何方法类。
  • 当您使用不依赖于类型参数的方法时,例如 Map.size()List.clear() .

通配符可以是无界的、上限的或下限的:

  • List<?>是一个无限通配符的例子。它表示未知类型的元素列表。

  • List<? extends Number>是一个上限通配符的例子。它匹配 List类型 Number ,以及它的子类型,例如 IntegerDouble .

  • List<? super Integer>是一个下界通配符的例子。它匹配 List类型 Integer ,以及它的父类(super class)型,NumberObject .

关于java - 在 Java Collections Map<Key,?> 中 "?"指的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29146908/

相关文章:

java - 使用 JFoenix 的 JFXDialog

java - 使用不同项目的方法(Eclipse 中的项目引用)

java - 在 for 循环中同时迭代映射和数组

mongodb - 将 MongoDB 集合存储在不同的驱动器上

java - “释放”Java 列表中的迭代器

garbage-collection - 如何将详细的垃圾收集输出重定向到文件?

java - 如何停止运行Spark应用程序?

generics - 有没有办法用 TypeScript 泛型进行传播操作?

c# - 通用接口(interface)的嵌套契约

java - 未经检查的转换编译器警告 java