带有节点的二元运算符“-”的错误操作数类型

bad operand types for binary operator '-' with Nodes

我正在尝试创建一个带有双向链表节点的优先级队列来对双向链表进行排序。 https://www.codingninjas.com/codestudio/problems/sort-a-k-sorted-doubly-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);
    }
}

问题是,当您从一个整数中减去另一个整数时,您 可能会 得到整数溢出...以及符号错误的结果。


解决此问题的另一种方法是尝试将 Node<T>data 值转换为 Comparable<?>,然后使用 Comparable.compare。这种方法将涉及一些隐式和显式运行时类型检查......并且理论上可以产生 ClassCastExceptions.