【发布时间】:2015-09-04 14:43:34
【问题描述】:
我想创建一个包含 HashSet 作为值的 HashMap,并在找不到键时返回一个空的 HashSet。
public class IsbnHashMap<K,V> extends HashMap<K,V> {
protected V defaultValue;
public IsbnHashMap(V defaultValue) {
this.defaultValue = defaultValue;
}
@Override
public V get(Object k) {
return containsKey(k) ? super.get(k) : defaultValue;
}
}
但是我的实现不起作用。
private static IsbnHashMap<String, HashSet<String>> isbnToId = new IsbnHashMap<String, HashSet<String>>();
这将返回“无法应用 HashSet”。如果我尝试将K,V 中的IsbnHashMap 更改为<String, HashSet<String>>,我也会遇到一些时髦的错误。我该如何实现?
【问题讨论】:
-
你没有向构造函数传递任何东西......(老实说,我建议不要这样做 - 它显着改变了开发人员对
Map的期望,但这是一个单独的问题。) -
您的合同(返回空 HashSet)与您的实现不一致,因为 (a) 无法保证构造函数中的对象为空,更重要的是 (b) 一旦它被返回为由于未找到查找的结果,接收方可以向其添加数据
-
我强烈建议为此使用适当设计的库,例如 Guava 的
Multimap,它可以正确地完成所有这些操作而不会违反接口契约。