[英]In Java Collections Map<Key,?> What does “?” refer to?
在 Java Collections 中,我看到了这样的东西: Map<Key,?>
。 我不知道它是如何工作的,谁能帮我解决这个问题或提供一个例子?
问号 (?) 表示未知类型。
在您的示例中, Map<Key, ?>
,这意味着它将匹配包含任何类型值的映射。 这并不意味着您可以创建Map<Key, ?>
并在其中插入任何类型的值。
从文档中引用:
在泛型代码中,称为通配符的问号 (?) 表示未知类型。 通配符可用于多种情况:作为参数、字段或局部变量的类型; 有时作为返回类型(尽管更具体的是更好的编程实践)。 通配符永远不会用作泛型方法调用、泛型类实例创建或超类型的类型参数。
例如,假设您想创建一个函数来打印任何地图的值,而不管值类型如何:
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<? extends Number>
是一个上限通配符的例子。 它匹配Number
类型的List
及其子类型,例如Integer
或Double
。
List<? super Integer>
List<? super Integer>
是下界通配符的一个例子。 它匹配Integer
类型的List
及其超类型Number
和Object
。
?
可以是任何数据类型
List<?>
表示类型为未知类型的List<Integer>
,这可能是List<Integer>
、 List<Boolean>
、 List<String>
等。
现在来到你的榜样Map<Key,?>
手段Value
是在这个地图中插入可以是任何数据类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.