2014-10-16 4 views
2

У меня есть класс, предназначенный для реализации общей кучи, и у меня возникла проблема с генериками, которые я использую. Определение класса: public class BinHeap <T extends Comparable<? super T>> {переопределение переопределений Java-функций внутри класса

Внутри класса у меня есть функция для удаления наименьшего значения из кучи (оно недоделано из-за ошибки, которую я получаю).

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]; правильного типа?

ответ

5

Определите только класс T. В настоящее время вы определяете второй метод T по методу, который скрывает T от класса. Вы можете просто ссылаться на T в методе, когда вы удаляете переопределение T по методу.

public T deleteMin() { // T is already in scope 
Смежные вопросы