在Java中,如何转换List到列表< T>使用通用方法,以便我可以用单个方法调用来替换以下内容的模式:
List untypedList = new ArrayList(); // or returned from a legacy method
List typedList = new ArrayList();
for (Object item: untypedList)
typedList.add((Integer)item);
请注意,上述代码不会产生任何类型安全警告,理想情况下,您的解决方案也不应产生任何此类警告.
将提供以下解决方案的工作,只要该列表Class< L>有一个公共默认构造函数?
public class ListUtil {
public static > L typedList(List> untypedList, Class itemClass, Class listClass) {
L list = null;
try {
list = listClass.newInstance();
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
for (Object item: untypedList)
list.add(itemClass.cast(item));
return list;
}
}
(注意,如果Class< L>的实例没有公共的默认构造函数,则listClass.newInstance()会引发InstantiationException或IllegalAccessException.如果该方法没有正确处理这些异常,可能会出现什么问题?)
笔记:
> T是结果列表中每个项目的类型.
> L是我想创建的列表的类型(扩展了List< T>).
> untypedList是“无类型”输入列表,与List< Object>有效地相同.
> itemClass表示T的运行时类.
> listClass表示L的运行时类.