java - K、V 有多通用?

标签 java generics

如果我定义一个 Map<K,V> map = new HashMap<K, V>()为什么我不能做类似的事情:

map.put(new MyKey<CustomObject>(), new SomeOtherObject<CustomObject>());

但如果我通过另一种方法进行操作,它会起作用,即:

add(new MyKey<CustomObject>(), new SomeOtherObject<CustomObject>());  

public <K, V> void add(K k, V v){  
        Map<K, V> threadLocalMap = new HashMap<K, V>();  
        threadLocalMap.put(k, v);  
}  

最佳答案

您需要显式声明 map 中使用的类型:

Map<MyKey,SomeOtherObject> map = new HashMap<MyKey, SomeOtherObject>();
map.put(new MyKey<CustomObject>(), new SomeOtherObject<CustomObject>());

在您的第二个示例中,add方法是通用的,因此当您调用它时,K 和 V 将替换为调用代码中使用的实际类型。

编辑

你好像误解了Map<K, V>的意思. K 和 V 没有任何具体的含义,它们只是表明你可以将映射“参数化”为只接受某种类型的键和某种类型的值。但定义这些类型是您的责任。

在您的第一个示例中,您想使用 MyKey作为键的类型( K )和 SomeOtherObject对于值(V)。所以你需要为这些类型创建一个特定的映射:Map<MyKey,SomeOtherObject> map = new HashMap<MyKey, SomeOtherObject>(); .

你不能简单地写Map<K, V>因为 K 和 V 对编译器没有任何意义(除非您创建了一个名为 K 的类和一个名为 V 的类,但我假设您还没有)。

在你的第二个例子中,你使用了一个泛型方法,它接受两个类型为 K 和 V 的参数。当调用该方法时,K 和 V 被接收到的实际类型替换,所以你的例子中的代码被转换与我答案顶部的代码非常相似。

我希望这能澄清一些事情。我建议您花时间阅读有关泛型的教程并查看具体示例。

关于java - K、V 有多通用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12423629/

相关文章:

java - 如何将字符串动态转换为其他类型java

java - 设置时间选择器日期

java - 选项卡布局的选项卡不显示任何内容

c# - 当调用递归泛型接口(interface)上的扩展方法时,结构实例是否会被装箱?

c# - "real number"类型是否有 C# 泛型约束?

java - 如何显示jmx MBean的类描述、属性描述和操作描述

java - 在旧代收集未满的情况下是否会发生完整的垃圾收集

python - 如何在Python中实现泛型? Java 或 C++ 之类的东西提供

c# - 在树结构C#中查找类型T的所有对象

java - Java 中的函数 "composition"和类型安全