在Java Collections Map <key,?>中有什么“?”参考?</key,?>

时间:2015-03-19 14:14:16

标签: java generics collections hashmap

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

2 个答案:

答案 0 :(得分:22)

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

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

引用documentation

  

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

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

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

此通配符称为 unbounded ,因为它不提供有关该类型的信息。在某些情况下,您可能希望使用无界通配符:

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

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

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

  • List<? extends Number>上限通配符的示例。它匹配List类型Number及其子类型,例如IntegerDouble

  • List<? super Integer>下限通配符的示例。它匹配List类型Integer及其超类型NumberObject

答案 1 :(得分:1)

未知通配符

?可以是任何dataType

List<?>表示键入未知类型的列表,可以是List,List,List等。

现在转到您的示例Map<Key,?>表示要插入此地图的Value可以是任何数据类型。