Вложенные дженерики коллекции java - PullRequest
3 голосов
/ 24 мая 2011

Я хотел бы вызвать метод, определенный как

<T> void foo(Class<? extends Collection<T>>)

но компилятор не пропустит

foo(ArrayList<Integer>.class);

Каков синтаксис для получения класса типа универсального типа?

Я реализую общий случай, когда у меня есть

Map<Key, Collection<Value>>

и хотите вставить значение в коллекцию. Если коллекция не существует, она должна создать новую и вставить в нее значение. Пока у меня есть следующий код, но с предупреждениями безопасности типа:

public static <K, V, C extends Collection<V>> boolean addToMappedCollectionNotNull(Map<K, C> aMap, K key, V element, Class<? extends Collection> type) {
    C collection = aMap.get(key);
    if (collection == null) {
        try {
            collection = (C)type.newInstance();
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        }
        aMap.put(key, collection);
    }

    return collection.add(element);
}

Ответы [ 3 ]

1 голос
/ 24 мая 2011

Как сказал Борис , вы, вероятно, ищете MultiMap. Но если вы считаете, что вам нужно передавать информацию о типе, то маркер супертипа - это решение. Guice имеет реализацию TypeLiteral , которую вы можете посмотреть.

0 голосов
/ 24 мая 2011

Foo (ArrayList.class); * +1002 *

Невозможно получить class параметризованного типа, поскольку нет точного представления типа времени выполнения .

Вам придется изменить дизайн, чтобы не помещать так много логики в одном месте. Может быть, отделить деталь, которая проверяет null Collection, и деталь, которая создает его в другом месте, например, на фабрике.

0 голосов
/ 24 мая 2011

Та же цель может быть достигнута с помощью библиотеки Guava от Google. Есть интерфейс Multimap<K, V>, который связывает набор значений V с ключом K.

Коллекция, похожая на карту, но который может связывать несколько значений с одним ключом. Если вы звоните put(K, V) дважды, с тем же ключом, но разные значения, мультикарта содержит сопоставления от ключа к обоим значения.

Multimap реализуется с помощью ListMultimap, SetMultimap и SortedSetMultimap, охватывающих все возможные потребности для сбора значений V.

...