我想调用一个像
这样定义的方法<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);
}
答案 0 :(得分:1)
作为Boris said,您可能正在寻找MultiMap。但如果您认为必须传输类型信息,则super type token是一种解决方案。 Guice有一个TypeLiteral实现,您可以查看。
答案 1 :(得分:0)
使用Google的Guava库可以实现相同的目标。有一个界面Multimap<K, V>
,它将一组值V
与一个键K
相关联。
类似于地图的集合,但是 这可能会关联多个值 用一把钥匙。如果你致电
put(K, V)
两次,用同样的钥匙但是 不同的值,多图 包含从键到两者的映射 值。
Multimap
由ListMultimap
,SetMultimap
和SortedSetMultimap
实施,涵盖了值V
的所有可能需求。
答案 2 :(得分:0)
FOO(ArrayList.class);
您无法获得参数化类型的class
,因为有no exact runtime type representation。
你必须重新设计它,不要在一个地方放置太多逻辑。也许可以分开测试null
Collection
的部分以及在不同的地方创建的部分,例如工厂。