3

我正在实现一组数据结构,并决定尝试通过数组来实现 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是抛出 a ClassCastException,因为从 向下转换Object,不是Comparable,是不安全的。我遇到了这个问题,不确定如何实现构造函数。任何帮助,将不胜感激。

4

2 回答 2

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;

如果你控制了里面的内容,那就没有问题了。

我将在 Rohit 的评论中链接问题和答案,因为它很棒。

于 2013-10-09T21:00:50.687 回答
0

只需将其更改为

data = (T[])new Comparable[INIT_CAPACITY];
于 2013-10-10T01:32:56.220 回答