为什么DefaultListModel.toArray()抛出ClassCastException?

时间:2018-10-01 11:43:09

标签: java arrays

我正在尝试将DefaultListModel内容复制到数组中。 以下行导致异常

  

testArray =(cGenIndicator [])indObjList.toArray();

void testCasting() {
    DefaultListModel<cGenIndicator> indObjList;
    indObjList = new DefaultListModel<cGenIndicator>();
    indObjList.addElement(new cGenIndicator(null, null));

    cGenIndicator[] testArray;
    try {
        // This line causses exception saying
        // [Ljava.lang.Object; cannot be cast to [LIndicator.cGenIndicator;
        testArray = (cGenIndicator[]) indObjList.toArray();
    } catch(Exception e) {
        test++;
    }

    test++;
}

3 个答案:

答案 0 :(得分:7)

toArray,不带参数,将返回Object[],不能强制转换为cGenIndicator[]。相反,您可以使用获取数组作为参数填充的重载方法:

testArray = indObjList.toArray(new cGenIndicator[indObjList.size()]);

编辑:

DefaultListModel没有这种重载方法,Mia Kulpa。将Object[]转换为cGenIndicator的一种方法是使用流:

testArray = Arrays.stream(indObjList.toArray())
                  .map(cGenIndicator.class::cast)
                  .toArray(cGenIndicator[]::new)

答案 1 :(得分:2)

DefaultListModel.toArray返回Object[],并且Object[]无法直接转换为cGenIndicator[]

您可以通过以下方式实现:

Object[] objectArray = defaultListModel.toArray();
int length = objectArray.length;

cGenIndicator[] testArray = new cGenIndicator[length];
System.arraycopy(objects, 0, testArray, 0, length);

答案 2 :(得分:1)

DefaultModel::toArray()方法产生的是Object[]而不是cGenIndicator[]

如果这是List,则应使用toArray(new cGenIndicator[0])。 有关更多信息,请参考javadoc或https://stackoverflow.com/a/5374346/139985。请注意,后者谈论的是String[],但原理是完全相同的。

对于DefaultModelList,您没有此选项:

  • 简单的解决方案是摆脱类型强制转换,并将类型testArray更改为Object[]

  • 您还可以将Object[]的元素显式复制到类型更合适的数组中。这是否值得取决于您将如何使用数组。


,请修正您的类/接口名称,使其符合Java样式规则。 cGenIndicator应该是CGenIndicator ...或更易读。