我正在尝试将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++;
}
答案 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
...或更易读。