在 Comparable 接口中覆盖 compareTo() 的问题
Problems with overriding compareTo() in interface Comparable
我正在开发一个程序,它必须覆盖 Comparable 中的 CompareTo() 才能使 Collections.sort() 工作。因为我正在使用由助手组成的 ArrayList,所以我必须根据名称对其进行排序。
我浏览了论坛,发现并尝试更改
public class Assistant{
到
public class Assistant implements Comparable<Assistant>{
在 return 中允许我在另一个 class 中使用 Collections.sort() 并且不会警告我任何错误,但是,出现了两个新错误。
首先,在同一行中
public class Assistant implements Comparable<Assistant>{
它告诉我 "it is not abstract and does not override compareTo(Assistant) in Comparable." 当我转到我创建的 compareTo() 时:
@Override
public int compareTo(Object o2){
Assistant m2 = (Assistant) o2;
if(this.name.compareTo(m2.name) == 0){
return 0;
}else if(this.name.compareTo(m2.name)<0){
return -1;
}else{
return 1;
}
}
(小助手的构造器只有名字)。
但是,在这个地方我在@Override 中有一个错误:
"method does not override or implement a method from a supertype"。
并在下一行
public int compareTo(Object o2){
我收到另一个错误(与上一个相关)告诉我:
"Name clash: compareTo(Object) in Assistant and compareTo(Assistant) in Assistant have the same erasure, yet neither overrides the other."
我有点理解这个问题,我没有覆盖原来的 compareTo()。
我是 java 的新手,因此如果有人发现问题,请您也能解释我做错了什么(或遗漏了什么),我将不胜感激。
谢谢:)
由于您正在实施 Comparable,因此您的 compareTo() 方法需要一个 Assistent 类型的参数。
所以使用这个应该可行:
@Override
public int compareTo(Assistent m2) {
if(this.name.compareTo(m2.name) == 0){
return 0;
}else if(this.name.compareTo(m2.name)<0){
return -1;
}else{
return 1;
}
}
因为你参数化了Comparable
(类型参数是Assistant
)。应该这样做(我稍微简化了一下):
@Override
public int compareTo(Assistant o){
return this.name.compareTo(o.name);
}
这是因为有 Assistant
类型的 Comparable
改变
public int compareTo(Object o2)
给,
public int compareTo(Assistant o2)
对于已经正确说明了如何编译实现的示例,我将添加一些规则以供您记住有关覆盖方法的规则:
- 要覆盖您需要使用相同方法名称的方法,
- 协变(向后兼容)return 类型,
- 相同或更广泛的访问类型,但不更窄。
- 但是参数列表必须不同。
第 4 条解释了为什么需要将参数类型从 Object 更改为 Assistant 以使其成功覆盖 compareTo() 方法。
我正在开发一个程序,它必须覆盖 Comparable 中的 CompareTo() 才能使 Collections.sort() 工作。因为我正在使用由助手组成的 ArrayList,所以我必须根据名称对其进行排序。
我浏览了论坛,发现并尝试更改
public class Assistant{
到
public class Assistant implements Comparable<Assistant>{
在 return 中允许我在另一个 class 中使用 Collections.sort() 并且不会警告我任何错误,但是,出现了两个新错误。
首先,在同一行中
public class Assistant implements Comparable<Assistant>{
它告诉我 "it is not abstract and does not override compareTo(Assistant) in Comparable." 当我转到我创建的 compareTo() 时:
@Override
public int compareTo(Object o2){
Assistant m2 = (Assistant) o2;
if(this.name.compareTo(m2.name) == 0){
return 0;
}else if(this.name.compareTo(m2.name)<0){
return -1;
}else{
return 1;
}
}
(小助手的构造器只有名字)。
但是,在这个地方我在@Override 中有一个错误: "method does not override or implement a method from a supertype"。
并在下一行
public int compareTo(Object o2){
我收到另一个错误(与上一个相关)告诉我: "Name clash: compareTo(Object) in Assistant and compareTo(Assistant) in Assistant have the same erasure, yet neither overrides the other."
我有点理解这个问题,我没有覆盖原来的 compareTo()。
我是 java 的新手,因此如果有人发现问题,请您也能解释我做错了什么(或遗漏了什么),我将不胜感激。
谢谢:)
由于您正在实施 Comparable,因此您的 compareTo() 方法需要一个 Assistent 类型的参数。
所以使用这个应该可行:
@Override
public int compareTo(Assistent m2) {
if(this.name.compareTo(m2.name) == 0){
return 0;
}else if(this.name.compareTo(m2.name)<0){
return -1;
}else{
return 1;
}
}
因为你参数化了Comparable
(类型参数是Assistant
)。应该这样做(我稍微简化了一下):
@Override
public int compareTo(Assistant o){
return this.name.compareTo(o.name);
}
这是因为有 Assistant
改变
public int compareTo(Object o2)
给,
public int compareTo(Assistant o2)
对于已经正确说明了如何编译实现的示例,我将添加一些规则以供您记住有关覆盖方法的规则:
- 要覆盖您需要使用相同方法名称的方法,
- 协变(向后兼容)return 类型,
- 相同或更广泛的访问类型,但不更窄。
- 但是参数列表必须不同。
第 4 条解释了为什么需要将参数类型从 Object 更改为 Assistant 以使其成功覆盖 compareTo() 方法。