【发布时间】:2015-08-05 01:36:54
【问题描述】:
看看这个简短的课程。
它有什么作用?它是一个 HashMap,其中键是 Class 对象,值是 Hashmap,键和值的类型由 Class 对象定义。
假设你想要一个方法 add(K obj),这将是一个方便的方法。你为什么要强迫用户输入 add(Person.class, personInstance),当你也可以让他把实例本身传递给你时——代码应该能够获取对象的类并将实例放在 key 下对象的类。但我不能。 add(K obj) 便捷方法无法编译:
public class TypedHashmap extends HashMap<Class, HashMap> {
public <K> HashMap<K, K> getHashMap(Class<K> type) {
return (HashMap<K, K>) getOrDefault(type, new HashMap<K, K>());
}
public <K> void add(K obj, Class<K> type) {
HashMap<K, K> toModify = getHashMap(type);
toModify.put(obj, obj);
}
public <K> void add(K obj) {
add(obj, obj.getClass());
}
}
编译错误:
我可以看到 Java 不确定 obj.getClass() 类型。但我不明白为什么。是因为它不能确保该类实际上不是扩展 K 的东西吗?这里有什么问题?这可以以某种方式解决吗?
【问题讨论】:
-
根本问题是
Object.getClass()的返回类型 -
您真的想要地图地图吗?还是类映射到该类的实例?
-
推理困难。我最初想要一张
, Set > 的地图。但是,您无法从集合中获取特定对象,您只能询问它是否存在或将其删除。请参阅此处stackoverflow.com/a/18380755/1920149 带来的问题以及您应该使用哈希图作为 Set 的替代品的建议:stackoverflow.com/questions/7283338/… -
如果你打算这样做,不要扩展
HashMap。扩展HashMap是一个里面有各种孔的设计。有人可以用他们想要的任何地图致电put。写一个包裹地图的类更合适。