不安全地将Object转换为Comparable类型会导致麻烦

时间:2013-10-09 20:56:00

标签: java generics constructor classcastexception type-safety

我正在实现一组数据结构,并决定尝试通过数组实现maxheap,因为它是maxheaps的常见实现之一。为此,我有一个名为MaxHeap<T>的界面,它接受Comparable个类型T和以下类签名:

 public class ArrayMaxHeap<T extends Comparable<T>> implements MaxHeap<T> {

T必须是Comparable,否则在从堆中添加和删除时,我将无法相互比较元素。问题在于类的构造函数:

public class ArrayMaxHeap<T extends Comparable<T>> implements MaxHeap<T> {

    private T[] data;
    private int last;
    private static final int INIT_CAPACITY = 10;

    /**
     * Creates an empty ArrayMaxHeap with the default capacity.
     */
    public ArrayMaxHeap(){
        data = (T[])(new Object[INIT_CAPACITY]);
        last = 0;
    }

data的类型转换正在抛出ClassCastException,因为来自Object的向下转换({1}}不安全。我用这个打了一堵墙,我不确定如何实现构造函数。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

这是对泛型的限制。而只是将您的数组声明为Object[]并投射您尝试返回的元素。类似于ArrayList所做的事情。

public E get(int index) {
    rangeCheck(index);

    return elementData(index);
}

E elementData(int index) {
    return (E) elementData[index];
}

其中elementData

private transient Object[] elementData;

如果你控制了什么,那就没问题了。

I'm going to link the question and answer in Rohit's comment because it's brilliant.

答案 1 :(得分:0)

只需将其更改为

即可
data = (T[])new Comparable[INIT_CAPACITY];