Я пытаюсь создать приоритетную очередь с узлами двусвязного списка для сортировки двусвязного списка. 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
кто-нибудь может сказать, почему я получаю эту ошибку? и как это исправить?




Вы не можете вычесть произвольный объект из другого
На самом деле вы пытаетесь здесь вычесть одно 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.