我正在编写一个通用最大堆的简单实现。如果我写
public class FastMaxHeap<T>{
T[] data;
int size;
static final int HEAP_SIZE = 10000;
@SuppressWarnings("unchecked")
public FastMaxHeap(){
data = (T[]) new Object[HEAP_SIZE];
size = 0;
}
}
它编译。现在要实际实现堆,即编写 maxHeapify(),我需要能够比较两个 T。先验似乎可能的一种选择是告诉编译器 T 实现了 Comparable。但是,如果我输入 replace < T > with < T implements Comparable > 编译器会抱怨——我该怎么做呢?
或者,我可以定义一个类
public class HasValue{
int value;
public HasValue(int value){
this.value = value;
}
}
理论上我应该能够比较两个 HasValue 对象,如 x.value > y.value。但是如果我输入
public class FastMaxHeap<T extends HasValue>{
T[] data;
int size;
static final int HEAP_SIZE = 10000;
@SuppressWarnings("unchecked")
public FastMaxHeap(){
data = (T[]) new Object[HEAP_SIZE];
size = 0;
}
}
我现在得到一个 ClassCastException。这里发生了什么?Java 泛型伤害了我的大脑。