在Java Collections Map <Key,?>中有什么"?" 参考?

Gow*_*san 9 java generics collections hashmap

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

And*_*ira 22

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

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

引用文档:

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

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

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

然后调用此函数传递一个Map<String, Integer>as参数:

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

你会得到:

1 2
Run Code Online (Sandbox Code Playgroud)

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

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

结果:

one two
Run Code Online (Sandbox Code Playgroud)

此通配符称为无界,因为它不提供有关类型的信息.有几种情况您可能希望使用无界通配符:

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

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

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

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

  • List<? super Integer>有界下限通配符的示例.它匹配一个List类型Integer,以及它的超类型,NumberObject.