嵌套的java集合泛型

时间:2011-05-24 06:57:47

标签: java generics collections

我想调用一个像

这样定义的方法
<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 个答案:

答案 0 :(得分:1)

作为Boris said,您可能正在寻找MultiMap。但如果您认为必须传输类型信息,则super type token是一种解决方案。 Guice有一个TypeLiteral实现,您可以查看。

答案 1 :(得分:0)

使用Google的Guava库可以实现相同的目标。有一个界面Multimap<K, V>,它将一组值V与一个键K相关联。

  

类似于地图的集合,但是   这可能会关联多个值   用一把钥匙。如果你致电put(K, V)   两次,用同样的钥匙但是   不同的值,多​​图   包含从键到两者的映射   值。

MultimapListMultimapSetMultimapSortedSetMultimap实施,涵盖了值V的所有可能需求。

答案 2 :(得分:0)

  

FOO(ArrayList.class);

您无法获得参数化类型的class,因为有no exact runtime type representation

你必须重新设计它,不要在一个地方放置太多逻辑。也许可以分开测试null Collection的部分以及在不同的地方创建的部分,例如工厂。