![](/img/trans.png)
[英]Is the compareTo method (in the Comparable interface) recursive?
[英]Extending comparable interface and override compareTo
我知道这已被问过1000次,我已经看到了1000个答案,但我没有看到任何对我有用的东西。
我必须对实现我自己的接口的对象列表进行排序。 我决定扩展Comparable接口并为这些对象实现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对象。 但不是当它们的界面(Field)代表它们时。
我可以对ConcreteField列表进行排序,但我无法对Field of List进行排序。 当然这是自然的,因为compareTo的实现在ConcreteField中,但我希望java会在实现Field的每个具体对象上调用compareTo。 似乎并非如此。
但是,您如何实际排序由其可比较的界面表示的对象?
另一个我不知道的奇怪的事情。
使用@Override over compareTo方法会使编译器大喊大叫:ConcreteField类型的compareTo(Field)方法必须覆盖或实现超类型方法。 咦? 没有超类型,它只是实现了一个接口。
当我从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
请在下面找到我的代码和解释。
public interface Field extends Comparable<Field> {
}
接口实现Comparable接口。 以下是实施。
Java总是查看引用的类型。 如果您通过接口引用对象,那么您将只看到接口和常量中的方法。
如果您有任何疑问,请告诉我。
public class ConcreteField implements Field {
private String name;
/**
* @return the name
*/
public String getName() {
return name;
}
public ConcreteField(String name) {
this.name = name;
}
@Override
public int compareTo(Field o) {
ConcreteField cf = (ConcreteField) o;
return this.getName().compareTo(cf.getName());
}
public static void main(String[] args) {
List<Field> list = new ArrayList<Field>();
list.add(new ConcreteField("test"));
list.add(new ConcreteField("abc"));
list.add(new ConcreteField("dec"));
list.add(new ConcreteField("mef"));
list.add(new ConcreteField("keg"));
list.add(new ConcreteField("sdf"));
list.add(new ConcreteField("abc"));
System.out.println(list);
Collections.sort(list);
System.out.println(list);
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("ConcreteField [name=");
builder.append(name);
builder.append("]");
return builder.toString();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.