Nano Hash - криптовалюты, майнинг, программирование

Переопределение дженериков Java внутри функции класса

У меня есть класс, предназначенный для реализации универсальной кучи, и у меня проблема с используемыми дженериками. Определение класса 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]; правильного универсального типа?

16.10.2014

Ответы:


1

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

public T deleteMin() {  // T is already in scope
16.10.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..