java - HashMap<K,V> 之前的 <K,V> 是什么意思? Java 中的泛型

标签 java generics

我正在阅读《Effectiveprogramming in Java》一书,在阅读过程中我遇到了这样的代码片段:

public static <К, V> HashMap<K, V> newInstance() {
    return new HashMap<K, V>();
}

表达式 <K, V> 表示什么?静态和 HashMap<K,V> 之间它是如何调用和工作的?我听说过泛型,但我不太了解它们,我想知道为什么不可能写一些像:

public static HashMap<K, V> newInstance() {
    return new HashMap<K, V>();
}

为什么之前HashMap<K, V>我需要写<К, V>

最佳答案

当你写作时

public static HashMap<K, V> newInstance() {
    return new HashMap<K, V>();
}

KV是必须解析为某种类型(类名或接口(interface)名)的常规标识符。

例如,如果您想要一个返回 HashMap 的方法有一个 String key 和 Integer值,你可以写:

public static HashMap<String,Integer> newInstance() {
    return new HashMap<String,Integer>();
}

此方法将始终返回 HashMap<String,Integer> ,因此您只能将其分配给:

HashMap<String,Integer> map = newInstance();

但是,如果你想要KV要成为泛型类型参数,您必须将它们声明为泛型类型参数。这就是你用 <K,V> 所做的事情:

public static <К, V> HashMap<K, V> newInstance() {
    return new HashMap<K, V>();
}

这允许您使用此方法返回 HashMap不同的键和值类型:

HashMap<String,Integer> map1 = newInstance();
HashMap<Long,Boolean> map2 = newInstance();
...

关于java - HashMap<K,V> 之前的 <K,V> 是什么意思? Java 中的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49031448/

相关文章:

java - Cassandra 和插入 float 列

ios - Json 解码为具有动态值类/结构类型的 swift 类

Scala:指定默认泛型类型而不是 Nothing

java - 在 Tomcat 中部署的问题

java - 发现多个文件的操作系统独立路径为 'META-INF/groovy-release-info.properties'

java - 泛型的使用是子类

c# - 为扩展方法问题转换 IEnumerable<T>

Java 签名小程序无法在浏览器上运行

typescript - TypeScript 3 的通用 curry 函数

swift - swift 扩展一个泛型类