gpt4 book ai didi

java - 扩展可比接口(interface)并重写 compareTo

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:46 25 4
gpt4 key购买 nike

我知道这可能已被问过 1000 次,我已经看到 1000 个答案,但我没有看到任何对我有用的答案。

我必须对实现我自己的接口(interface)的对象列表进行排序。我决定扩展 Comparable 接口(interface)并为这些对象实现 compareTo 方法。

我的界面:

public interface Field extends Comparable<Field> {

}

我的对象类

public class ConcreteField implements Field {

public int compareTo(Field other){
return this.getName().compareTo(other.getName());
}
}

这并不像我预期的那样有效。

编译器似乎认识到 ConcreteField 必须实现 compareTo。没关系。

通过上面的示例,我可以比较 ConcreteField 对象。但当它们由其接口(interface)(字段)表示时则不然。

我可以对 ConcreteField 列表进行排序,但我无法对字段列表进行排序。当然这很自然,因为 compareTo 的实现是在 ConcreteField 中,但我期望 java 会在每个实现 Field 的具体对象上调用 compareTo。好像不是这样的。

但是,您实际上如何对由其可比接口(interface)表示的对象进行排序?

我只是不明白的另一个奇怪的事情。

在 compareTo 方法上使用 @Override 会使编译器大喊大叫:ConcreteField 类型的方法 compareTo(Field) 必须覆盖或实现父类(super class)型方法。嗯?没有父类(super class)型,它只是实现一个接口(interface)。

当我从 ConcreteField 类中删除 compareTo 时。编译器提示必须执行它。当我使用 eclipse quickfix 时,它说“实现缺少的方法”,它没有这样做,并告诉我“无法实现缺少的方法,要么是由于编译器错误,要么是项目构建路径没有解析所有依赖项”。

完全没有依赖关系。它都在同一个项目甚至同一个包中。那么这到底有什么问题呢?

最佳答案

@Masud:您建议的实现方式(帖子已删除)

创建一个像这样的界面:

public interface Field<T> extends Comparable<T> {
public String getName();
}

创建一个 ConcreteField 类:

import java.util.Arrays;


public class ConcreteField implements Field<Field>{

private String name;

@Override
public int compareTo(Field other) {
return this.name.compareTo(other.getName());
}

@Override
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public static void main(String[] args) {
ConcreteField[] c = new ConcreteField[3];
c[0] = new ConcreteField();
c[1] = new ConcreteField();
c[2] = new ConcreteField();
c[0].setName("c");
c[1].setName("b");
c[2].setName("a");

Arrays.sort(c);
for(int i=0;i<c.length;i++) {
System.out.println(c[i].getName());
}

}
}

我得到的输出是排序的。

a
b
c

关于java - 扩展可比接口(interface)并重写 compareTo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20214308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com