and*_*dge 2 java generics casting
我正在编写一个通用最大堆的简单实现.如果我写
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;
}
}
Run Code Online (Sandbox Code Playgroud)
它汇编.现在要实际实现堆,即写入maxHeapify(),我需要能够比较两个T.先验似乎可能的一个选择是告诉编译器T实现Comparable.但是,如果我用<T implements Comparable>键入replace <T>,编译器会抱怨 - 我该怎么做?
或者,我可以定义一个类
public class HasValue{
int value;
public HasValue(int value){
this.value = value;
}
Run Code Online (Sandbox Code Playgroud)
}
理论上我应该能够比较两个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;
}
}
Run Code Online (Sandbox Code Playgroud)
我现在得到一个ClassCastException.这里发生了什么?Java泛型伤害了我的大脑.
在第一种情况下T extends Object,它Object在运行时被删除.
在第二种情况下T extends HasValue被删除,HasValue所以你需要.
data = (T[]) new HasValue[HEAP_SIZE];
Run Code Online (Sandbox Code Playgroud)
恕我直言,Java new T[HEAP_SIZE]无论如何都不允许做你必须做的事情.