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

Java 为什么DefaultListModel.toArray()抛出ClassCastException?,java,arrays,Java,Arrays,我正在尝试将DefaultListModel内容复制到数组中。 以下行导致异常 testArray=(cginIndicator[])indObjList.toArray() void testCasting(){ DefaultListModelIndobjList; indObjList=新的DefaultListModel(); addElement(新的cginindicator(null,null)); cGenIndicator[]测试阵列; 试一试{ //这句话引起了一个例外 //

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

testArray=(cginIndicator[])indObjList.toArray()

void testCasting(){
DefaultListModelIndobjList;
indObjList=新的DefaultListModel();
addElement(新的cginindicator(null,null));
cGenIndicator[]测试阵列;
试一试{
//这句话引起了一个例外
//[Ljava.lang.Object;无法强制转换为[LIndicator.cGenIndicator;
testArray=(cginIndicator[])indObjList.toArray();
}捕获(例外e){
测试++;
}
测试++;
}

toArray
在没有参数的情况下,将返回一个
对象[]
,该对象不能强制转换为
cGenIndicator[]
。相反,您可以使用重载方法将数组作为参数填充:

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

DefaultListModel
没有此重载方法Mia Kulpa。将
对象[]
转换为
cginindicator
的一种方法是使用流:

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

DefaultModel::toArray()
方法生成一个
对象[]
而不是
cginindicator[]

如果这是一个
列表
,您可以使用
来代替数组(新的cginindicator[0])
。 有关更多信息,请参阅javadoc或to。请注意,后者谈论的是
String[]
,但原理完全相同

对于
DefaultModelList
您没有此选项:

  • 简单的解决方案是去掉类型转换,并将类型更改为
    testArray
    Object[]

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



请修改您的类/接口名称以符合Java风格规则。
cGenIndicator
应该是
cGenIndicator
…或更可读的东西。

DefaultListModel.toArray
返回
对象[]
,并且
对象[]
不能直接强制转换到
cGenIndicator[]

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

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

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

它是一个
DefaultListModel
,而不是
列表的实例
Object[] objectArray = defaultListModel.toArray();
int length = objectArray.length;

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