0

我在以下代码中收到 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 类的派生词吗?如果是这样,为什么还会发生这种转换错误?

4

3 回答 3

6

toArray()返回一个Object[]. 您需要的是toArray(T[] a)由于类型擦除,泛型集合无法创建类型化数组。

通过使用重载方法,您可以帮助它创建类型化的Destination对象数组。

采用

destinations = destinationsList.toArray(new Destination[destinationList.size()]);

于 2013-11-14T08:30:55.083 回答
2

因为 toArray 返回一个对象数组而不是你的Destination[]

用这个替换它

destinations[] = destinationsList.toArray(new Destination[destinationList.size()]);

这将填充新的目标数组对象并返回填充的数组。

编辑:

在@ZouZou的回答中回答您的问题。

你需要,new Destination[]因为 aDestination[]可以被 a 引用,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对象的属性。这就是为什么向上转换继承树是合法的而向下转换是不合法的。

于 2013-11-14T08:33:16.270 回答
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
于 2013-11-14T09:02:23.543 回答