Java 在集合实例工厂中正确使用泛型

Java 在集合实例工厂中正确使用泛型,java,generics,factory,apache-commons,Java,Generics,Factory,Apache Commons,我正在尝试使用Apache Commons Collections v4执行以下操作: Map<Integer, List<String>> namesPerNumber = MapUtils.lazyMap( new HashMap<Integer, List<String>>(), FactoryUtils.instantiateFactory(ArrayList.class)

我正在尝试使用Apache Commons Collections v4执行以下操作:

Map<Integer, List<String>> namesPerNumber = 
        MapUtils.lazyMap(
            new HashMap<Integer, List<String>>(), 
            FactoryUtils.instantiateFactory(ArrayList.class));

namesPerNumber.get(1).add("Mickey");
Map namesPerNumber=
MapUtils.lazyMap(
新建HashMap(),
instancefactory(ArrayList.class));
namesPerNumber.get(1).添加(“米奇”);
但我在lazyMap调用时遇到以下编译器错误:


方法lazyMap(Map,Factory由于类型擦除,类文本只支持可重新定义的类型或原始类型,因此
ArrayList.class
表示原始类型
ArrayList
,而不是预期的
ArrayList

解决此问题的一种方法是使用一个未选中的操作:

@SuppressWarnings("unchecked") Class<ArrayList<String>> type = (Class)ArrayList.class;

Map<Integer, List<String>> namesPerNumber = 
    MapUtils.lazyMap(
        new HashMap<Integer, List<String>>(), 
        FactoryUtils.instantiateFactory(type));
相反

如果您使用的是Java8,那么最好的选择是

Map<Integer, List<String>> namesPerNumber = 
    MapUtils.lazyMap(new HashMap<>(), () -> new ArrayList<>());
Map namesPerNumber=
lazyMap(新的HashMap(),()->新的ArrayList());

您可以尝试使用强制转换强制类型,如下所示:
MapUtils.lazyMap(new HashMap(),(Factory)FactoryUtils.instancefactory(ArrayList.class))
您的第一个示例可以用Java8编译。@tsolakp:不是用我的Java8…您是对的,它没有编译,但Eclipse没有显示任何错误。谢谢!Java8看起来很酷,但遗憾的是,它在当前项目中不可用(尚未)。我最喜欢prototypeFactory解决方案。我这里唯一考虑的是克隆与新的性能。但互联网似乎认为空集合的性能是可比的。你同意吗?这不太可能与性能相关,是的,我认为差异可以忽略不计。
@SuppressWarnings("unchecked") Class<ArrayList<String>> type = (Class)ArrayList.class;

Map<Integer, List<String>> namesPerNumber = 
    MapUtils.lazyMap(
        new HashMap<Integer, List<String>>(), 
        FactoryUtils.instantiateFactory(type));
Map<Integer, List<String>> namesPerNumber = 
    MapUtils.lazyMap(
        new HashMap<Integer, List<String>>(), 
        FactoryUtils.prototypeFactory(new ArrayList<String>()));
Map<Integer, List<String>> namesPerNumber = 
    MapUtils.lazyMap(new HashMap<>(), () -> new ArrayList<>());