我在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;
}
}
答案 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>