在Java中我有一个来自我的数据库的对象列表,我想将这些对象转换为我的类对象,但我找不到解决方案。
我的对象列表为SalvaguardasAGR
,我想将此对象转换为List<AGRSalvaguardasInforme>
。
我试过
List<AGRSalvaguardasInforme> InformeFinal = new ArrayList<AGRSalvaguardasInforme>(SalvaguardasAGR);
正如我在How to cast List<Object> to List<MyClass>和How to Convert List<String> to List<Object>中看到的那样,但抛出此异常:
25-sep-2014 17:40:47 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: El Servlet.service() para el servlet [procop2front] en el contexto con ruta [/CDNMS] lanzó la excepción [java.lang.Error: Unresolved compilation problem:
The constructor ArrayList<AGRSalvaguardasInforme>(List<Object>) is undefined
] con causa raíz
java.lang.Error: Unresolved compilation problem:
The constructor ArrayList<AGRSalvaguardasInforme>(List<Object>) is undefined at com.dominion.procop.agr.struts.actions.AGRInformes.mostrarInformeActivosAGR(AGRInformes.java:1140)
我尝试了一个简单的List<AGRSalvaguardasInforme> InformeFinal = (AGRSalvaguardasInforme)SalvaguardasAGR;
,但仍然无效。
我做错了什么?我如何将对象列表转换为AGRSalvaguardasInforme列表?
提前谢谢。
答案 0 :(得分:1)
Java 8:
List<AGRSalvaguardasInforme> InformeFinal = SalvaguardasAGR.stream().map(x -> (AGRSalvaguardasInforme)x).collect(Collectors.toList());
此:
ClassCastException
注意:我已对此进行了测试,但确实有效。
答案 1 :(得分:1)
您是否尝试像How to cast List<Object> to List<MyClass>问题的答案那样对其进行双重投射?
List<Object> list = getList();
List<DesiredType> castedList = (List<DesiredType>) (List) list;
但要小心,因为如果castedList.get(i)
包含的元素不属于ClassCastException
,则调用list
或其他方法可能会抛出DesiredType
。
这就是为什么我真的建议尝试立即获取List<DesiredType>
实例 - 你从哪里获得List<Object>
的实例?它来自您自己的代码(您可以修改的代码)还是来自您无法修改的其他库/代码?
答案 2 :(得分:0)
最简单,最合乎逻辑的方法就是迭代对象列表,然后将它们分别投射到AGRSalvaguardasInforme&#39;输入,并将它们添加到其他列表中,例如:
for (Object o : SalvaguardasAGR)
InformeFinal.add((AGRSalvaguardasInforme) o);
您也可以尝试直接转换列表,如下所示:
List<AGRSalvaguardasInforme> InformeFinal = (List<AGRSalvaguardasInforme>)(Object) SalvaguardasAGR
虽然该方法会标记未经检查的投射警告。
答案 3 :(得分:0)
如果您完全知道对象可以分配给AGRSalvaguardasInforme,您需要直接转换元素并将它们添加到具有目标类型的列表中:
public static <T> List<T> cast(Collection<?> list) {
List<T> valueList = new ArrayList<T>(list.size());
for(Object o : list) {
// throws casting exception
valueList.add((T)o);
}
return valueList;
}
您可以这样调用此方法:
List<AGRSalvaguardasInformeme> list = cast(salvaguardasAGR);
如果处理得当,您不应该将对象列表转换为其他内容列表。如果您有AGRSalvaguardasInformeme列表,为什么要最初创建正确键入的列表?我知道在某些情况下你无法避免这种情况(比如使用写得不好的库)。
答案 4 :(得分:0)
这是蛮力的方式:
// initialize new list with the same size as the old list
List<AGRSalvaguardasInforme> InformeFinal = new ArrayList<AGRSalvaguardasInforme>(SalvaguardasAGR.size());
// cast and insert the contents of the old list into the new list
for(Object obj : SalvaguardasAGR)
{
AGRSalvaguardasInforme newObj = (AGRSalvaguardasInforme) obj;
InformeFinal.add(newObj);
}
请注意,如果ClassCastException
不是Object
的实例,您将获得AGRSalvaguardasInforme
。
答案 5 :(得分:0)
如果SalvaguardasAGR是对象列表(而不是AGRSalvaguardasInforme)
你必须迭代并手动执行此操作
您发布的链接从列表到列表 - 特定于通用
你正在做相反的事情,通用于特定的