【问题标题】:Java generics redefinition inside class function类函数内的Java泛型重新定义
【发布时间】:2014-10-17 02:38:23
【问题描述】:

我有一个旨在实现泛型堆的类,但我正在使用的泛型存在问题。类定义是 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]; 成为正确的泛型类型?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    只在类上定义T。目前,您正在该方法上定义第二个T,它隐藏了类上的T。去掉方法上T的重新定义时,可以简单的参考方法中的T

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

    【讨论】:

      猜你喜欢
      • 2012-11-08
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      相关资源
      最近更新 更多