java - 为什么 compareTo() 中的参数不接受类名而只接受对象?

标签 java

我正在使用 Java 中的优先级队列实现 Dijkstra 算法。我正在为队列使用“节点”类的对象。为了实现这一点,我重写了 Node 类中的 compareTo() 方法。如果我使用“Object obj”作为 compareTo() 的参数,它工作正常。但是,当我将“Node obj”作为参数提供给 compareTo() 时,会显示一个错误,提示“Node 不是抽象的,并且不会覆盖 Comparable 中的抽象方法 compareTo(Object)”。据我所知,这应该是可能的。怎么了?

    public class Node implements Comparable  
    {   int key;  
        int val;  
        public Node(int v)  
        {   val=v;  
            key=0;  
        }

    @Override
        public int compareTo(Object obj)
        {   Node nd=(Node) obj;
            return this.key-nd.key;
        }

        public Node(int v, int k)
        {   val=v;
            key=k;
        }
    } 

如果我在上面的代码工作正常的情况下执行此操作(下面的代码),则会显示错误。

@Override
    public int compareTo(Node obj)
    {  
        return this.key-obj.key;
    }

最佳答案

Comparable 是一个指定参数化类型的接口(interface):

public interface Comparable<T>{...

我们也可以说它是一个泛型类(更短)。

所以声明public class Node implements Comparable{...
意味着你想实现 Comparable 而不是特定类型。

事实上对于编译器public class Node implements Comparable{

是一样的
public class Node implements Comparable<Object>{

因此,编译器期望找到 public int compareTo(Object obj)您类(class)中的方法。
而编译错误信息:

"Node is not abstract and does not override abstract method compareTo(Object) in Comparable."

指定要在要实现的 Comparable 接口(interface)中使用的类:(此处为 public class Node implements Comparable<Node>{)。

并且编译器将期望找到已实现的方法:

public int compareTo(Node obj)

关于java - 为什么 compareTo() 中的参数不接受类名而只接受对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44173948/

相关文章:

java - Java中的守护线程是什么?

java - Selenium waitForPageToLoad 中的竞争条件?

java - 如何从 jcheckbox 中删除复选框

java - 数组升序

java - 将 SecretKey 转换为字节,如何将其转换回 SecretKey?

java - Netbeans 创建独立 Jar

java - 如何计算 apache commons math3 库中函数的集成?

java - E4 获取 Activity 透视 ID 或标签

java - 在后台运行 Spring-retry

java - 从 Java 连接到 SQL Server 时出现问题