扩展可比较的界面和覆盖compareTo

时间:2013-11-26 10:23:23

标签: java interface comparable 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。似乎并非如此。

但是,那么,您如何实际排序由其可比较的界面表示的对象?

我不知道的另一件奇怪的事情。

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

当我从ConcreteField类中删除compareTo时。编译器抱怨它必须实现。当我使用eclipse quickfix,它说“实现缺失的方法”时,它没有这样做并告诉我“无法实现丢失的方法,无论是由于编译器错误还是项目构建路径都无法解决所有依赖关系”。

根本没有依赖性。它全部在同一个项目甚至同一个包中。 那到底出了什么问题呢?

2 个答案:

答案 0 :(得分:2)

@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

答案 1 :(得分:0)

请在下面找到我的代码和解释。

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();
}

}