我在以下代码中收到了ClassCastException:
Destination[] destinations;
ArrayList<Destination> destinationsList = new ArrayList<Destination>();
// .....
destinations = (Destination[]) destinationsList.toArray();
我的目标类看起来像这样:
public class Destination {
private String code;
Destination (String code) {
this.code = code;
}
public String getCode () {
return code;
}
}
从语法上讲,我没有收到任何错误,这只发生在运行时。虽然因为并非所有类都是Object类的衍生物,所以它很混乱?如果是这样,为什么甚至会发生这种转换错误呢?
答案 0 :(得分:6)
toArray()
会返回Object[]
。你需要的是toArray(T[] a)
因为类型擦除,泛型集合不能创建一个类型化的数组。
通过使用重载方法,您可以帮助它创建Destination
个对象的类型化数组。
使用
destinations = destinationsList.toArray(new Destination[destinationList.size()]);
答案 1 :(得分:2)
因为toArray返回的对象数组不是Destination[]
将其替换为
destinations[] = destinationsList.toArray(new Destination[destinationList.size()]);
这将填充新的Destination Array对象并返回填充的数组。
修改强>
在@ZouZou的回答中回答你的评论问题。
您需要new Destination[]
,因为Destination[]
可以引用Object[]
,但不可能反过来。
澄清事情,
String s = "hello";
Object o = s;
s = (String) o; //works
//but
String s = "hello";
Object o = s;
o = new Object;
s = (String) o; //gives you a ClassCastException because an Object
//cannot be referred by a string
因为String具有通过继承在
Object
类中定义的所有属性,但是Object不具有String
对象的属性。这就是为什么建立继承树是合法的,而不是向下转换。
答案 2 :(得分:0)
它没有在语言层面实现,因为泛型如何放入语言中。也不要尝试这样的事情:
// Destination[] destinations;
ArrayList<Destination> destinationsList = new ArrayList<Destination>();
//add some destinations
destinationsList.add(new Destination("1"));
destinationsList.add(new Destination("2"));
// .....
Object[] destinations = destinationsList.toArray();
destinations[1] = "2"; //simulate switching of one object in the converted array with object that is of other type then Destination
for (Object object : destinations) {
//we want to do something with Destionations
Destination destination = (Destination) object;
System.out.println(destination.getCode()); //exception thrown when second memeber of the array is processed
}
使用此:
destinations = destinationsList.toArray(new Destination[0]); //yes use 0