Неверные типы операндов для бинарного оператора '-' с узлами

Я пытаюсь создать приоритетную очередь с узлами двусвязного списка для сортировки двусвязного списка. https://www.codingninjas.com/codestudio/problems/sort-a-k-sorted-double-linked-list_1118118?leftPanelTab=0

/****************************************************************

    Following is the class structure of the Node class:

      class Node<T> {
        T data;
        Node<T> next;
        Node<T> prev;

        public Node(T data) {
            this.data = data;
        }
    }

*****************************************************************/
import java.util.*;
public class Solution {
    static class compareNode implements Comparator<Node>
    {
        public int compare(Node n1, Node n2){
            return n1.data-n2.data;
        }
    }
    public static Node<Integer> sortedDll(Node<Integer> head, int k) {
        PriorityQueue<Node> pq = new PriorityQueue<Node>(new compareNode());
        /* logic goes here*/
        return head;
    }

}

я получаю ошибку ниже, когда запускаю указанную выше программу

Compilation Failed
./Solution.java:21: error: bad operand types for binary operator '-'
            return n1.data-n2.data;
                          ^
  first type:  Object
  second type: Object
1 error

кто-нибудь может сказать, почему я получаю эту ошибку? и как это исправить?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете вычесть произвольный объект из другого

На самом деле вы пытаетесь здесь вычесть одно T из другого T. В общем, это недопустимо. (Стирание T равно Object.)

Это означает, что

static class compareNode implements Comparator<Node> {
    public int compare(Node n1, Node n2){
        return n1.data-n2.data;
    }
}

не будет работать.

Но... подождите... проблема на самом деле требует, чтобы ваш код сравнивал Node<Integer> экземпляры, а не Node<?> экземпляры. Итак, что вам нужно, это что-то немного как это:

static class compareNode implements Comparator<Node<Integer>> {
    public int compare(Node<Integer> n1, Node<Integer> n2){
        return n1.data-n2.data;
    }
}

... и я думаю, вы обнаружите, что это компилируется. Но это неправильно. Правильный способ написать это:

static class compareNode implements Comparator<Node<Integer>> {
    public int compare(Node<Integer> n1, Node<Integer> n2){
        return n1.data.compareTo(n2.data);
    }
}

Проблема в том, что когда вы вычитаете одно целое число из другого, вы получаете целочисленное переполнение могу... и результат с неправильным знаком.


Другой способ решить эту проблему — попытаться преобразовать data значения Node<T> в Comparable<?>, а затем использовать Comparable.compare. Этот подход будет включать некоторые неявные и явные проверки типов во время выполнения... и теоретически может производить ClassCastExceptions.

Другие вопросы по теме