Я хотел сделать карту коллекций в 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:
Как 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 только обеспечивают надлежащий сбор
да, я уже говорил, что это только там ilustrate идею – Slartibartfast 2008-10-31 18:12:41