Sla*_*ast 4 java generics collections
我想用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);
}
}
Run Code Online (Sandbox Code Playgroud)
我试图用类似的东西制作它
public class CollectionMap<K, C extends Collection<V>> extends HashMap<K, C>
Run Code Online (Sandbox Code Playgroud)
但编译器抱怨该<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: }
Run Code Online (Sandbox Code Playgroud)
和ListMap看起来几乎相同,除了我创建新ArrayList的第7行.这种重复小到可以容忍,但问题仍然存在于Java中这种"嵌套泛型"可能吗?
编辑:
正如埃里克森所说,解决方案<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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
而ListMap和SetMap只提供适当的集合
eri*_*son 11
如果map是a Map<K, Collection<V>>,请使用成语computeIfAbsent(...).add(...),如下所示:
map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
Run Code Online (Sandbox Code Playgroud)
或者,对于Set:
map.computeIfAbsent(key, k -> new HashSet<>()).add(value);
Run Code Online (Sandbox Code Playgroud)
如果是一个选项,您可能只想使用Google Collections API - http://code.google.com/p/google-collections/.
即使你不能使用它,也许看看他们如何实现他们的MultiMaps将帮助你实现.