为什么compareTo()中的参数不接受类名而只接受Object?

时间:2017-05-25 06:41:24

标签: java

我在java中使用Priority Queue实现Dijkstra算法。我正在使用一个班级的对象节点'为队列。为了实现这一点,我将重写Node类中的compareTo()方法。如果我正在使用" Object obj"它正常工作。作为compareTo()的参数。但是,当我给予" Node obj"作为compareTo()的参数,正在显示错误,说明" Node不是抽象的,并且不会覆盖Comparable中的抽象方法compareTo(Object)。"从我所读到的,这应该是可能的。怎么了?

captchaToken

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

    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;
        }
    } 

5 个答案:

答案 0 :(得分:1)

因为您已覆盖的界面(Comparable)未被键入。您需要使用Java Generics来声明要比较的类型: -

public class Node implements Comparable<Node>

这表示您希望Node的类型为Comparable并允许您执行

public int compareTo(Node obj)

如果你没有对其进行泛化,那么你实际上是在做一个@Override然后更改方法签名,编译器会将其标记为错误,因为你正在对一个方法执行@Override在界面中。

答案 1 :(得分:1)

改为执行此操作,

public class Node implements Comparable <Node>{

这是因为Comparable是一个generic界面,正如文档中所述,它采用参数T

  

T - 此对象可与

进行比较的对象类型

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

答案 2 :(得分:1)

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

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)方法 编译错误信息:

  

&#34;节点不是抽象的,不会覆盖抽象方法   compareTo(Object)in Comparable。&#34;

指定要在正在实施的Comparable界面中使用的类:(此处为public class Node implements Comparable<Node>{)。

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

public int compareTo(Node obj)

答案 3 :(得分:0)

Interface Comparable<T>

是一个通用接口,因为你没有绑定任何类型,默认是Object绑定所需类型(Comparable<Node>),你就没事了。

答案 4 :(得分:0)

您尝试实施的界面 - Comparable是通用的。如果未指定任何泛型参数,则泛型参数默认为Object

根据界面,Comparable<Object>应该有这个方法:

public int compareTo(Object o);

但是在你的代码中,你只有这个方法:

public int compareTo(Node obj);

编译器认为它们不同,所以抱怨。

要解决此问题,只需指定泛型类型参数即可。这没什么难的:

public class Node implements Comparable<Node>