如何将List <object>转换为List <myclass>?</myclass> </object>

时间:2014-09-25 15:35:45

标签: java list object collections

在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列表?

提前谢谢。

6 个答案:

答案 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)

你必须迭代并手动执行此操作

您发布的链接从列表到列表 - 特定于通用

你正在做相反的事情,通用于特定的