在Java Collections Map<Key,?>“?”指的是什么?未知通配符

2022-09-04 06:40:59

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


答案 1

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

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

引用文档

在泛型代码中,问号 (?)称为通配符,表示未知类型。通配符可用于各种情况:作为参数,字段或局部变量的类型;有时作为返回类型(尽管更好的编程实践是更具体)。通配符从不用作泛型方法调用、泛型类实例创建或超类型的类型参数。

例如,假设您要创建一个函数,该函数将打印任何地图的值,而不考虑值类型:

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

然后调用此函数传递 as 参数: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
  • 使用不依赖于 type 参数的方法时,例如 或 。Map.size()List.clear()

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

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

  • List<? extends Number>上限通配符的一个示例。它与 类型匹配 ,以及其子类型,例如 或 。ListNumberIntegerDouble

  • List<? super Integer>下限通配符的一个示例。它与 a 类型匹配 ,以及它的超类型,以及 。ListIntegerNumberObject


答案 2

未知通配符

?可以是任何数据类型

List<?>表示键入到未知类型的列表,这可以是 a、a、a 等。List<Integer>List<Boolean>List<String>

现在来到您的示例意味着要在此映射中插入的可以是任何数据类型。Map<Key,?>Value