【问题标题】:Casting from type object to a class从类型对象转换为类
【发布时间】:2023-03-19 17:10:01
【问题描述】:

我目前正在尝试填充 Stipulations 类型的对象数组,这是一个

public abstract interface

我填充这个数组的方法如下,popStipAttr 是一个简单的 switch 语句。

    public static Stipulations[] popStipArr(ZASAllocation zasAlloc) 

    {
          //ArrayList<String> s = new ArrayList<String>();
          ArrayList<Stipulations> stipAL  = new ArrayList<Stipulations>();

          for(int i = 0; i < NoStip; i++)
          {
          stipAL.add(popStipAttr(i,zasAlloc));
          }

          Stipulations[] StipArr =  (Stipulations[]) stipAL.toArray();
          return StipArr;
    }

但是我收到关于投射的错误:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lc.Stipulations;

我在这里到底做错了什么我创建了相同类型的arraylist,为什么将它转换为该类型的数组会抛出这个?

【问题讨论】:

    标签: java arrays casting arraylist


    【解决方案1】:

    ArrayList.toArray 返回一个Object[](如消息中所述,它不能转换为Stipulations[])。但是,ArrayList.toArray(T[] a) 返回 T[]。因此,改变

    Stipulations[] StipArr =  (Stipulations[]) stipAL.toArray();
    

    Stipulations[] StipArr =  (Stipulations[]) stipAL.toArray(new Stipulations[0]);
                                                              ^^^^^^^^^^^^^^^^^^^
    

    哦,对了。刚刚意识到可能导致混乱的原因。 [Ljava.lang.Object; 中的前导 [ 表示它是一个数组。 [Lc.Stipulations; 也一样。也许这就是为什么你写 Casting from type object to a class 作为标题 :-) 现在你知道了 :-)

    【讨论】:

    • 好伙伴! Stack 不会让我再接受 3 分钟的回答
    【解决方案2】:

    你在做什么

    Stipulations[] StipArr =  (Stipulations[]) stipAL.toArray();
    

    正在调用 java.util.List 类的方法

    Object[] toArray(); 
    

    这将返回一个 Object[],它不能转换为您的 Stipulations[]
    您要调用的是 java.util.List 上的方法

    <T> T[] toArray(T[] a);
    

    这将返回您的类型的数组。 所以试试

    Stipulations[] StipArr =  stipAL.toArray(new Stipulations[stipAL.size()]);
    

    这是一种奇怪的语法,往往会污染代码,因此和其他一些原因,我总是尽可能地尝试使用列表,并且从不转换为数组,除非绝对必要,例如不受我控制的外部 API 需要它

    【讨论】:

    • 抱歉有点晚了,分心了,以前的答案没有重复答案..
    • 喜欢详细的解释。是的,我正在使用外部罐子
    猜你喜欢
    • 1970-01-01
    • 2018-11-27
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    相关资源
    最近更新 更多