将通用数组传递给构造函数

时间:2013-02-22 06:51:32

标签: java generics

有没有办法将有界泛型类型的数组传递给具有相同泛型类型的参数的方法,而不会引发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());
    }
}

3 个答案:

答案 0 :(得分:1)

Joshua Bloch撰写的有效Java(第25项):

  

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

因此,使用列表而不是带有泛型的数组。

答案 1 :(得分: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())));
    }
}

答案 2 :(得分:-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[]类型的数组。