当前位置: 首页 > 知识库问答 >
问题:

扩展Compariable接口并重写Comparieto

淳于熙云
2023-03-14

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

我必须对实现我自己接口的对象列表进行排序。我决定扩展可比接口并为这些对象实现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的列表进行排序,但我不能对字段的列表进行排序。当然,这是很自然的,因为compareTo的实现在ConcreteField中,但我希望java会对实现字段的每个具体对象调用compareTo。似乎不是这样。

但是,实际上如何对由可比较的接口表示的对象进行排序?

另一件奇怪的事,我就是不明白。

使用@Override over compareTo方法会让编译器大喊大叫:ConcreteField类型的方法compareTo(Field)必须重写或实现超类型方法。嗯?没有超类型,它只是实现一个接口。

当我从ConcreteField类中删除compareTo时。编译器抱怨它必须实现。当我使用eclipse快速修复程序时,它说“实现缺失的方法”,它失败了,并告诉我“无法实现缺失的方法,要么是由于编译器错误,要么是项目构建路径没有解决所有依赖关系”。

根本没有依赖关系。它都在同一个项目中,甚至是同一个包中。这到底是怎么回事?

共有2个答案

衡翰藻
2023-03-14

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

public interface Field extends Comparable<Field> {
}

接口实现可比接口。下面是实现。

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

}
储承
2023-03-14

@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
 类似资料:
  • 我正在开发一个程序,该程序必须重写Comparable中的CompareTo(),以生成集合。排序()工作。因为我使用的是一个由助手组成的ArrayList,我必须根据名称进行排序。 我环顾了论坛,发现了这一点,并尝试改变 到 作为回报,我可以使用这些收藏。sort()在另一个类中,并且没有警告我任何错误,但是,出现了两个新错误。 首先,在同一行中 它告诉我“它不是抽象的,也不会覆盖Compara

  • 有人知道如何扩展dropwizard界面吗?现在它只有所需的选项,但我需要为anooted方法添加权限。 例如: 我有一个用户管理员和一个普通用户。两者都可以进行身份验证并到达我的@auth带注释的资源。但我想允许一些(不是全部)http方法请求只为管理员和普通用户删除。如何在资源之外执行此操作?类似的东西

  • 主要内容:org.springframework.context.ApplicationContextInitializer,org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor,org.springframework.beans.factory.config.BeanFactoryPostProcessor,,,,,,,,,,,,1.可扩展的接口启动调用顺序图 ApplicationConte

  • 主要内容:org.springframework.context.ApplicationContextInitializer,org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor,org.springframework.beans.factory.config.BeanFactoryPostProcessor,,,,,,,,,,,,1.可扩展的接口启动调用顺序图 ApplicationConte

  • 问题内容: 为了减少类的依赖性,我想将参数(使用泛型类)发送到扩展某些类并实现接口的构造函数,例如 可能吗? 此外,使用T类,我想使用T.getActivity()作为Context创建视图。 问题答案: T必须扩展Fragment并实现SomeInterface 在这种情况下,您可以声明以下内容: 这将需要扩展和实现类型的对象。 此外,使用T类,我想使用T.getActivity()作为Cont

  • 为什么它这样做,它有一个更好的做法?在sub接口中实现方法有什么区别吗?