我正在实现一组数据结构,并决定尝试通过数组实现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}}不安全。我用这个打了一堵墙,我不确定如何实现构造函数。任何帮助将不胜感激。
答案 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];