Java 在集合实例工厂中正确使用泛型
我正在尝试使用Apache Commons Collections v4执行以下操作: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)
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<>());