【问题标题】:List<Object> java.lang.ClassCastException: java.util.Vector cannot be cast to java.util.ArrayListList<Object> java.lang.ClassCastException: java.util.Vector 不能转换为 java.util.ArrayList
【发布时间】:2019-05-17 07:51:57
【问题描述】:

这是我的简单代码。我需要一个 ArrayList listOnayStatu 的克隆。 GtbEtobsOYenibelge 是一个实体。但是有一个转换问题java.lang.ClassCastException: java.util.Vector cannot be cast to java.util.ArrayList。 谢谢

List<GtbEtobsOYenibelge> listOnayStatu = new ArrayList<>();
List<GtbEtobsOYenibelge> cloneOnayStatu;
listOnayStatu = servis.listOnayStatus4Belge(user.getBirimId().getId());
cloneOnayStatu =  ((List) ((ArrayList) listOnayStatu).clone());

所有的代码都是这样的。

【问题讨论】:

标签: java list arraylist vector


【解决方案1】:

您可以只使用接受Collection&lt;? extends E&gt;ArrayList 的复制构造函数:

List<GtbEtobsOYenibelge> listOnayStatu = servis.listOnayStatus4Belge(user.getBirimId().getId());
List<GtbEtobsOYenibelge> cloneOnayStatu = new ArrayList<>(listOnayStatu);

这样您就可以创建listOnayStatu 的副本。此外,您不应该再依赖clone(),因为它已被证实是一个错误的决定

【讨论】:

    【解决方案2】:

    您可以尝试将其另存为新的数组列表。

    List<GtbEtobsOYenibelge> listOnayStatu = new ArrayList<>();
    List<GtbEtobsOYenibelge> cloneOnayStatu;
    listOnayStatu = servis.listOnayStatus4Belge(user.getBirimId().getId());
    cloneOnayStatu =  new ArrayList(listOnayStatu);
    

    或者你可以使用 addAll

    cloneOnayStatu.addAll(listOnayStatu);
    

    【讨论】:

      【解决方案3】:

      方法servis.listOnayStatus4Belge 返回一个VectorVector 实现了List 接口,但不是ArrayList。因此,您不能将其转换为一个。

      看有问题的说法:

      cloneOnayStatu =  ((List) ((ArrayList) listOnayStatu).clone());
      

      您正在复制一个向量并将其分配给cloneOnayStatu。你应该可以这样做:

      cloneOnayStatu = (List<GtbEtobsOYenibelge>) ((Vector<GtbEtobsOYenibelge>)listOnayStatu).clone();
      

      clone() 方法调用将返回另一个 Vector,但它声明的返回类型为 Object。因此,您需要将其转换为 List 才能使作业生效。

      但是,clone() 现在很少使用。通过使用构造函数,您可以更好地控制您希望结果的类型,例如:

      cloneOnayStatu = new ArrayList<>(listOnayStatu);
      

      【讨论】:

      • 谢谢 Klitos,但 clone() 方法不适用于列表。
      • listOnayStatu 更新时,cloneOnayStatu 会同时更新。我希望 cloneOnayStatu 在更新时具有以前的 listOnayStatu 大小。
      • clone() 方法和new ArrayList&lt;&gt;() 构造函数都会创建副本,当原始更新时,这些副本更新。但是请注意,这些副本只是references 的副本。如果引用的对象本身被更新,那么两个列表都会看到更新,因为两个列表的元素都引用同一个对象。也许你想要一个深拷贝。为此,您需要遍历所有元素并创建每个元素的副本。
      猜你喜欢
      • 1970-01-01
      • 2017-10-29
      • 2013-03-24
      • 2020-12-20
      • 2023-03-29
      • 2013-07-11
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多