[英]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)
,则多重映射包含从键到两个值的映射。
Multimap
由ListMultimap
、 SetMultimap
和SortedSetMultimap
实现,涵盖了值V
集合的所有可能需求。
foo(ArrayList.class);
您无法获得参数化类型的class
,因为没有确切的运行时类型表示。
您将不得不重新设计它,以免将太多逻辑放在一个地方。 也许将测试null
Collection
的部分分开,而将在不同地方创建的部分(如工厂)分开。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.