1

有没有办法将有界泛型类型的数组传递给具有相同泛型类型的参数而不引发 ClassCastException 的方法?:

public class Heap<E extends Comparable>  implements java.lang.Cloneable{

    private java.util.ArrayList<E> list = new java.util.ArrayList<E>();

    public Heap(E[] objects) {
         for (int i = 0; i < objects.length; i++) {
            add(objects[i]);
        }
    }

    private  void add(E newObject){
    ...
    }

    @Override
    protected Heap<E> clone() {
        return new Heap<E>((E[])list.toArray());
    }
}
4

3 回答 3

1

Joshua Bloch 的 Effective Java(第 25 条):

创建泛型类型、参数化类型或类型参数的数组是非法的。这些数组创建表达式都不是合法的 new List<E>[]、 new List<String>[]new E[]

所以使用列表而不是带有泛型的数组。

于 2013-02-22T07:06:20.807 回答
0

如果您对所有应该这样做的未经检查的演员表都满意:

class Heap<E extends Comparable>  implements java.lang.Cloneable{

    private java.util.ArrayList<E> list = new java.util.ArrayList<E>();
    Class<E> classE;

    public Heap(E[] objects) {
        Class<? extends Object[]> aClass = objects.getClass();
        this.classE = (Class<E>) aClass.getComponentType();
        for (int i = 0; i < objects.length; i++) {
            add(objects[i]);
        }
    }

    private  void add(E newObject){
        ...
    }

    @Override
    protected Heap<E> clone() {
        return new Heap<E>(list.toArray((E[])Array.newInstance(classE, list.size())));
    }
}
于 2013-02-22T07:25:22.073 回答
-1
 return new Heap<E>((E[])list.toArray());

不,数组不能进行类型转换(好吧,只能从Object)。

改用:

 return new Heap<E>(list.toArray((E[])new Comparable[0]));

(假设您使用有界类型的Comparable,否则使用:

return new Heap<E>(list.toArray((E[])new Object[0]));

)

这将返回一个类型为 的数组E[]

于 2013-02-22T06:56:27.790 回答