我正在寫一個通用最大堆的簡單實現。如果我寫通用類中的java通用鑄造
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。但如果我輸入< T>用< T實現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泛型傷害了我的大腦。
爲什麼不直接存儲'Comparables'? 「Java泛型傷害了我的大腦」+1「 – Perception
+1」。 –