Я хотел сделать Карту Коллекций на 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 выглядит примерно так же, за исключением строки 7, где я создаю новый ArrayList. Такое дублирование достаточно мало, чтобы быть терпимым, но остается вопрос, возможен ли такой тип «вложенных обобщений» в Java?
EDIT:
Как сказал Эриксон , решение находится в <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 обеспечивают только надлежащую коллекцию