在Java中,我想向常规地图添加getOrAdd方法,就像ConcurrentHashMap上的putIfAbsent一样。此外,对于某个键,我想存储一个项目列表。这是我的尝试:public class ListMap<K, V> extends HashMap<K, V> { private HashMap<K, List<V>> map; public ListMap() { map = new HashMap<K, List<V>>(); } public List<V> getOrAdd(K key) { if (map.containsKey(key)) { return map.get(key); } else { List<V> l = new ArrayList<V>(); map.put(key, l); return l; } }}但是,如果有人想遍历ListMap,则需要显式转换值。ListMap<Integer, MyClass> listMap = new ListMap<Integer, MyClass>();for (Map.Entry<Integer, MyClass> entry : listMap.entrySet()) { List<MyClass> val = (List<MyClass>) entry.getValue();}有没有一种方法可以通过某些方法扩展HashMap类而不创建子类? (我已经在C#中看到了这一点)如何修改ListMap类,以便无需转换即可获取ListMaps的值(列表)? 最佳答案 您的类的实例也将是HashMap,因此您不需要甚至不应该仅添加另一个字段来支持getOrAdd方法,因为其他继承但未覆盖的方法将不会引用map字段,而是引用实例。因此,与其添加单独的字段private HashMap<K, List<V>> map;将this的扩展类型更改为public class ListMap<K, V> extends HashMap<K, List<V>> ^^^^^^^并将您的ListMap方法更改为不使用getOrAdd字段,而是使用mappublic List<V> getOrAdd(K key) { if (containsKey(key)) { return get(key); } else { List<V> l = new ArrayList<V>(); put(key, l); return l; }}此更改将使您可以像ListMap<Integer, String> listMap = new ListMap<Integer, String>();for (Map.Entry<Integer, List<String>> entry : listMap.entrySet()) { List<String> val = entry.getValue();//NO CASTING NEEDED}
10-06 00:19