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

Java 为什么compareTo()中的参数不接受类名,而只接受对象?,java,Java,我正在java中使用优先级队列实现Dijkstra算法。我正在为队列使用类“节点”的对象。为了实现这一点,我将重写节点类中的compareTo()方法。如果我使用“Object obj”作为compareTo()的参数,则工作正常。然而,当我将“Node obj”作为compareTo()的参数时,显示了一个错误,即“Node不是抽象的,并且不会覆盖Comparable中的抽象方法compareTo(Object)”。从我所读的内容来看,这应该是可能的。怎么了 public class

我正在java中使用优先级队列实现Dijkstra算法。我正在为队列使用类“节点”的对象。为了实现这一点,我将重写节点类中的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
),这样就可以了。

接口Comparable
是一个通用接口,由于您没有绑定任何类型,因此默认为对象绑定所需的类型(
Compariable
),这样就可以了。

,因为您覆盖的接口()不是类型化的。您需要使用来声明要比较的类型:-

public class Node implements Comparable<Node>
如果不泛型它,则实际上是在执行
@Override
,然后更改方法签名,编译器会将其标记为错误,因为您正在对不在接口中的方法执行
@Override

因为您已重写的接口()未键入。您需要使用来声明要比较的类型:-

public class Node implements Comparable<Node>
如果不泛型,则实际上是在执行
@Override
,然后更改方法签名,编译器会将其标记为错误,因为您正在对不在接口中的方法执行
@Override

改为执行此操作

public class Node implements Comparable <Node>{
public类节点实现可比较{
这是因为它是一个接口,如文档所述,它采用一个参数
T

T
-可与此对象进行比较的对象类型

如果没有此参数,它将解析为
对象
,这是您不需要的

public class Node implements Comparable <Node>{
public类节点实现可比较{
这是因为它是一个接口,如文档所述,它采用一个参数
T

T
-可与此对象进行比较的对象类型


如果没有此参数,它将解析为
对象
,这是您不需要的。

您尝试实现的接口-
可比
,是泛型的。如果未指定任何泛型参数,则泛型参数默认为
对象

根据界面,可比较的
应具有以下方法:

public int compareTo(Object o);
public int compareTo(Node obj);
但在代码中,您只有以下方法:

public int compareTo(Object o);
public int compareTo(Node obj);
编译器认为它们是不同的,因此抱怨

要解决此问题,只需指定一个泛型类型参数。这并不困难:

public class Node implements Comparable<Node>
public类节点实现可比较

您尝试实现的接口-
Compariable
,是通用的。如果您未指定任何通用参数,则通用参数默认为
对象

根据界面,可比较的
应具有以下方法:

public int compareTo(Object o);
public int compareTo(Node obj);
但在代码中,您只有以下方法:

public int compareTo(Object o);
public int compareTo(Node obj);
编译器认为它们是不同的,因此抱怨

要解决此问题,只需指定一个泛型类型参数。这并不困难:

public class Node implements Comparable<Node>
public类节点实现可比较

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

public interface Comparable<T>{...
因此,编译器希望在类中找到一个
public int compareTo(Object obj)
方法。
而编译错误消息:

“节点不是抽象的,并且不重写抽象方法 在可比较中比较(对象)。”

指定要在正在实现的可比较接口中使用的类:(此处
公共类节点实现可比较{
)。

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

public int compareTo(Node obj)

Comparable是指定参数化类型的接口:

public interface Comparable<T>{...
因此,编译器希望在类中找到一个
public int compareTo(Object obj)
方法。
而编译错误消息:

“节点不是抽象的,并且不重写抽象方法 在可比较中比较(对象)。”

指定要在正在实现的可比较接口中使用的类:(此处
公共类节点实现可比较{
)。

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

public int compareTo(Node obj)

改为执行此操作
节点实现可比较的
改为执行此操作
节点实现可比较的