如果我定义一个 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/