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