运行时的java.lang.ClassCastException

时间:2013-11-14 08:29:49

标签: java type-conversion

我在以下代码中收到了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类的衍生物,所以它很混乱?如果是这样,为什么甚至会发生这种转换错误呢?

3 个答案:

答案 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