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