【问题标题】:How to convert List<Object> into List<MyClass>?如何将 List<Object> 转换为 List<MyClass>?
【发布时间】:2014-09-25 15:35:44
【问题描述】:

在 Java 中,我有一个来自数据库的对象列表,我想将此对象转换为我的类对象,但我找不到解决方案。

我的对象列表是SalvaguardasAGR,我想将此对象转换为List&lt;AGRSalvaguardasInforme&gt;

我试过了

List&lt;AGRSalvaguardasInforme&gt; InformeFinal = new ArrayList&lt;AGRSalvaguardasInforme&gt;(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&lt;AGRSalvaguardasInforme&gt; InformeFinal = (AGRSalvaguardasInforme)SalvaguardasAGR;,但还是不行。

我做错了什么?如何将对象列表转换为 AGRSalvaguardasInforme 列表?

提前谢谢你。

【问题讨论】:

  • 你有异常吗?如果是,请发布堆栈跟踪
  • 添加了堆栈跟踪
  • 为 mostrarInformeActivosAGR 提供代码
  • 目前的问题是他试图创建一个新的List,以List作为构造函数参数,ArrayList构造函数不支持上交List。

标签: java list object collections


【解决方案1】:

Java 8:

List<AGRSalvaguardasInforme> InformeFinal = SalvaguardasAGR.stream().map(x -> (AGRSalvaguardasInforme)x).collect(Collectors.toList());

这个:

  • 按顺序将列表的元素视为流
  • 通过强制转换来转换流的每个元素(实际上,这根本不做任何转换,但它会检查以确保对象在正确的类中,如果不是则抛出ClassCastException)李>
  • 将结果项收集到一个新列表中

注意:我已经对此进行了测试,并且可以正常工作。

【讨论】:

  • Java 8 中看起来非常酷 - 我曾考虑使用 Guava 发布类似的答案,但因为丑陋的匿名课程而跳过了 :)
【解决方案2】:

您是否尝试过像How to cast List<Object> to List<MyClass> 问题的答案一样重复使用它?

List<Object> list = getList();
List<DesiredType> castedList = (List<DesiredType>) (List) list;

但要小心,因为如果list 包含不属于DesiredType 的元素,调用castedList.get(i) 或其他方法可能会抛出ClassCastException

这就是为什么我真的建议立即尝试获取List&lt;DesiredType&gt; 实例 - 你从哪里获得List&lt;Object&gt; 的实例?它是来自您自己的代码(您可以修改的代码)还是来自您无法修改的另一个库/代码?

【讨论】:

  • 我相信你对ClassCastException 的看法是错误的。您编写的代码检查列表的每个元素以确保它是正确的类型——我刚刚测试了它。这意味着这样做可能会创建一个List&lt;DesiredType&gt;,其中包含不是DesiredType 的对象,从而破坏了Java 的整个类型系统。 ClassCastExceptions 可能会晚点出现,在完全出乎意料的地方。
  • @Yura 来自我自己的代码。在这一行中返回一个Vector&lt;E&gt; (我投了,但我不知道为什么忽略它)。以及当我尝试将对象列表转换为 myclass 列表时出现的错误:java.lang.ClassCastException: java.util.Vector cannot be cast to procop.agr.util.AGRSalvaguardasInforme
  • @S.Moreno 您能否添加代码 sn-p 生成 java.util.Vector 实例,您尝试将其转换为 List?我确定您的问题有不错的类型安全解决方案:)
【解决方案3】:

最简单和最合乎逻辑的方法就是遍历对象列表,并将它们单独转换为“AGRSalvaguardasInforme”类型,然后将它们添加到另一个列表中,例如:

 for (Object o : SalvaguardasAGR)
        InformeFinal.add((AGRSalvaguardasInforme) o);

您也可以尝试像这样直接转换列表:

 List<AGRSalvaguardasInforme> InformeFinal = (List<AGRSalvaguardasInforme>)(Object) SalvaguardasAGR

虽然该方法会标记未经检查的强制转换警告。

【讨论】:

  • 这种类型的转换不起作用,例如List 不是 List
  • 确实如此,但他似乎在暗示他的原始列表中的对象是“AGRSalvaguardasInforme”的实例,他只是想要一种将列表转换为正确类型的方法。
【解决方案4】:

这是蛮力方法:

// 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);
}

请注意,如果Objects 不是AGRSalvaguardasInforme 的实例,您将获得ClassCastException

【讨论】:

  • 是的,并添加 - 如果可能,不要使用 List 为 getter 使用 List 创建一个接口
【解决方案5】:

如果 SalvaguardasAGR 是对象列表(而不是 AGRSalvaguardasInforme)

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

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

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

【讨论】:

    【解决方案6】:

    如果您绝对知道对象可以分配给 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 列表,为什么最初要创建正确键入的列表?我了解在某些情况下您无法避免这种情况(例如使用编写不佳的库)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 2016-05-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多