2011-05-24 132 views
3

我想打电话定义如下嵌套Java集合泛型

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

的方法,但也没有办法编译器让我过去

foo(ArrayList<Integer>.class); 

什么语法来获得类型类泛型类型?

我实现,我有一个

Map<Key, Collection<Value>> 

,并要插入集合中的值通常情况下。如果集合不存在,它应该创建一个新集合并在其中插入值。 到目前为止,我有下面的代码,但类型安全警告:可以使用谷歌的Guava库实现

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

你能发布确切的错误消息吗? – jmg 2011-05-24 08:39:11

+0

在方法声明行中:Collection是一个原始类型。参考类型集合应参数化 – Jordi 2011-05-24 22:49:56

+0

在集合=(C)type.newInstance();行:类型安全:从捕获#2中未选中投射?将Collection扩展到C – Jordi 2011-05-24 22:51:04

回答

1

由于鲍里斯said你可能正在寻找一个MultiMap。但是如果您认为您必须传输类型信息,那么super type token就是一个解决方案。 Guice有一个TypeLiteral实现,你可以看看。

+0

如果在语言中实现类型标记,那么通用类型的标记将是理想的。超类型令牌,如TypeReference ,不是那么方便,但足够好。感谢您的链接。 – Jordi 2011-05-24 23:05:07

0

相同的目标。有一个接口Multimap<K, V>,它将一组值V与一个密钥K相关联。

类似的地图集合,但 可以 与单个键关联多个值。如果您拨打put(K, V) 两次,使用相同的密钥但 不同的值,多​​图 包含从键到 值的映射。

MultimapListMultimapSetMultimapSortedSetMultimap覆盖的值V收集所有可能需要执行的。

0

foo(ArrayList.class);

你不能得到一个参数化类型的class因为有no exact runtime type representation

你将不得不重新设计这个,不要把太多的逻辑放在一个地方。也许将测试的部分分开,然后在不同的地方创建一个测试,如Factory。