【发布时间】:2008-10-31 17:47:50
【问题描述】:
我想用 Java 制作集合地图,所以我可以制作类似的东西
public void add(K key, V value) {
if (containsKey(key)) {
get(key).add(value);
} else {
Collection c = new Collection();
c.add(value);
put(key, value);
}
}
我试着用类似的东西来实现它
public class CollectionMap<K, C extends Collection<V>> extends HashMap<K, C>
但是编译器抱怨<V> 部分,并且仍然存在制作正确的新集合的问题。
目前,我制作了两个类:SetMap,看起来像这样
1: public class SetMap<K, V> extends HashMap<K, Set<V>> {
2:
3: public void add(K key, V value) {
4: if (containsKey(key)) {
5: get(key).add(value);
6: } else {
7: Set<V> list = new HashSet<V>();
8: list.add(value);
9: put(key, list);
10: }
11: }
12:
13: }
和 ListMap 看起来几乎一样,除了我创建新 ArrayList 的第 7 行。这种重复小到可以容忍,但问题仍然存在,这种“嵌套泛型”在 Java 中是否可行?
编辑:
作为erickson said,解决方案在<A, B extends Something<A>> 而不仅仅是<B extends Something<A>>
所以代码看起来像
public abstract class CollelctionMap<K, V, C extends Collection<V>> extends HashMap<K, C> {
protected abstract C newCollection();
public void add(K key, V value) {
if (containsKey(key)) {
get(key).add(value);
} else {
C c = newCollection();
c.add(value);
put(key, c);
}
}
}
ListMap 和 SetMap 只提供正确的集合
【问题讨论】:
标签: java generics collections