繁体   English   中英

嵌套 java 集合 generics

[英]Nested java collection generics

我想调用一个定义为的方法

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

但是编译器没有办法让我通过

foo(ArrayList<Integer>.class);

获取泛型类型 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);
}

正如鲍里斯所说,您可能正在寻找MultiMap。 但是,如果您认为必须传输类型信息,则超级类型令牌是一种解决方案。 Guice 有一个可以查看的TypeLiteral实现。

使用 Google 的Guava库可以实现相同的目标。 有一个接口Multimap<K, V>将值的集合V与键K相关联。

类似于 Map 的集合,但它可能将多个值与单个键相关联。 如果您使用相同的键但值不同的两次调用put(K, V) ,则多重映射包含从键到两个值的映射。

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

foo(ArrayList.class);

您无法获得参数化类型的class ,因为没有确切的运行时类型表示

您将不得不重新设计它,以免将太多逻辑放在一个地方。 也许将测试null Collection的部分分开,而将在不同地方创建的部分(如工厂)分开。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM