Java泛型在类函数内重新定义

时间:2014-10-16 18:36:41

标签: java generics

我有一个类,旨在实现一个通用堆,我遇到了我正在使用的泛型的问题。类定义是  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];

1 个答案:

答案 0 :(得分:5)

仅在课程中定义T。目前,您在方法上定义了第二个T,它隐藏了类T。当您删除方法上T的重新定义时,您只需在方法中引用T即可。

public T deleteMin() {  // T is already in scope