我是Java新手,正在查看Java中Map.class中的forEach方法......下面是该方法的摘录:
default void forEach(BiConsumer<? super K, ? super V> action) {
Objects.requireNonNull(action);
for (Map.Entry<K, V> entry : entrySet()) {
K k;
V v;
//more code follows...
我的问题是... K K到底是怎么回事;这个方法继续使用k和v作为局部变量,所以我猜是Kk;和V v;行将参数赋给局部变量...但是如果这是真的,为什么这个语法不需要类型呢?提前感谢你的帮助。
我没有尝试任何东西或期望任何东西...只是想更好地了解这段代码在做什么。
2条答案
按热度按时间kokeuurv1#
即使理解什么是泛型,单凭这段代码也不是很清楚。
因此,您需要查看
Map
接口声明的顶部另请阅读:
cgvd09ve2#
Map<K, V>
是一个 * 参数化类型 *,这意味着它表示一个不同类型的完整系列,例如Map<String, Integer>
- aMap
,其中键为String
s,值为Integer
sMap<Integer, LocalDate>
- aMap
,其中键为Integer
s,值为LocalDate
s等等,但是所有这些类型都有一种相同之处--它们都是
Map
,其中键有某种类型,值有某种类型。现在,
Map
内部的处理过程基本相同,无论其键的类型或值的类型如何,因此Map.class
内部的代码都不应指定这些类型,而是使用K
来表示键的类型。和V
来表示值的类型。这些字母称为 * 类型参数 *,在Map.class
中使用它们来表示将在Map
中使用的类型。例如,如果您有一个
Map<String, Integer>
,那么K
表示String
,V
表示Integer
;如果您有一个具有不同键类型和值类型的Map
,那么K
和V
将表示其他内容。在你的问题中所展示的方法中,
k
是一个由K
表示的类型的局部变量,v
是一个由V
表示的类型的局部变量。同样,如果你有一个Map<String, Integer>
,k
实际上是一个String
变量,而v
是一个变量,但实际上可以是任何类型。在编写
//more code follows...
的地方,所讨论的代码只是从Map
中取出一个键和一个值,将变量k
和v
指向它们,然后将称为action
的BiConsumer
应用于它们。