一般的な最大ヒープの簡単な実装を書いています。私が書いたら
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() を記述するには、2 つの T を比較できる必要があります。アプリオリに可能と思われるオプションの 1 つは、T が Comparable を実装していることをコンパイラに伝えることです。しかし、replace < T > with < T implements Comparable > と入力すると、コンパイラは文句を言います - どうすればこれを行うことができますか?
または、クラスを定義することもできます
public class HasValue{
int value;
public HasValue(int value){
this.value = value;
}
}
理論的には、x.value > y.value のように 2 つの HasValue オブジェクトを比較できるはずです。しかし、私がタイプすると
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ジェネリックは私の脳を傷つけます。