我有一个类,旨在实现一个通用堆,我遇到了我正在使用的泛型的问题。类定义是
public class BinHeap <T extends Comparable<? super T>> {
在类中,我有一个函数来删除堆中的最小值(由于我得到的错误,它未完成)。
public <T extends Comparable<? super T>> T deleteMin() {
T returnVal = (T)arr[0];
T temp = (T)arr[num-1];
num--;
int hole = 0;
int ret = -1;
int newhole = newHole(hole,temp);
return null;
}
此函数调用newHole,此处定义
private int newHole(int hole, T item) {
int ret = -1;
if(1+(hole*2) < num+1) {
if(2+(hole*2) == num+1) {
if(arr[1+(hole*2)].compareTo(item) == -1) {
ret = 1+(hole*2);
}
}
else {
int smallerChild;
int smaller = arr[1+(hole*2)].compareTo(arr[2+(hole*2)]);
if(smaller == -1) {
smallerChild = 1+(hole*2);
}
else {
smallerChild = 2+(hole*2);
}
if(arr[smallerChild].compareTo(arr[hole]) == -1) {
ret = smallerChild;
}
}
}
return ret;
}
当我测试编译时,我收到以下错误
BinHeap.java:51: error: method newHole in class BinHeap<T#1> cannot be applied to given types;
int newhole = newHole(hole,temp);
^
required: int,T#1
found: int,T#2
reason: actual argument T#2 cannot be converted to T#1 by method invocation conversion
where T#1,T#2 are type-variables:
T#1 extends Comparable<? super T#1> declared in class BinHeap
T#2 extends Comparable<? super T#2> declared in method <T#2>deleteMin()
虽然我确实理解了编译器告诉我的内容,但我不知道如何解决这个问题。如何制作正确类型的T temp = (T)arr[num-1];
?
答案 0 :(得分:5)
仅在课程中定义T
。目前,您在方法上定义了第二个T
,它隐藏了类T
。当您删除方法上T
的重新定义时,您只需在方法中引用T
即可。
public T deleteMin() { // T is already in scope