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

我需要覆盖子类中的CompareTo方法

卢文博
2023-03-14

我有一个实现可比较接口的类A,和一个扩展A的类B。我需要找到一种方法来覆盖类B中的compareTo

我发现了一个类似的问题不能用可比的父子孙继承并试图实施提供的解决方案

A类:

public class A<E extends A> implements Comparable<E>{
    String surname;
    int age;
      A(String surname, int age){
        this.surname = surname;
        this.age = age;
    }

   public  int compareTo(E o) {
        int res=0;
        res =this.surname.compareTo(o.surname);
        if(res==0)
            res = this.age-o.age;
        return res;
}

B类:

public class B extends A<B> {
    int num;

    Student(String surname, int age, int num){
        super(surname,age);
        this.num = num;
    }
@Override
   public int compareTo(B o){
        int res=0;
        res =this.surname.compareTo(o.surname);
        if(res==0)
            res = this.age-o.age;
        if(res ==0){
            res= this.num-o.num;
        }
        return res;
    }

例外情况:

线程“main”java中出现异常。lang.ClassCastException:T4级。A不能转换为T4级。B(T4.A和T4.B在加载器“app”的未命名模块中)

共有3个答案

夏侯和韵
2023-03-14

学生!=B

B类需要一个名为B的构造函数

经慈
2023-03-14

你在类B中的方法应该写成这样:

@Override
public int compareTo(B o){
    int res=0;
    res =this.surname.compareTo(o.surname);
    if(res==0)
        res = this.age-o.age;
    if(res ==0){
        res= this.num-o.num;
    }
    return res;
}
轩辕季同
2023-03-14

你能发布失败的代码吗?

我刚在自己的机器上试过,似乎很管用。我唯一能重现错误的时候是使用以下代码:b.compareTo((b)a) 由于无法将父类型强制转换为其子类型,因此无法工作。

此外,我认为这只是一个复制错误,但您在提供的代码中缺少括号,并且类B的构造函数与类名不匹配。

 类似资料:
  • 我是一名Java新手,在可比接口中重写compareTo方法时遇到了一些问题。我的代码创建了一个HashMap,将字符串与int关联起来。我希望重写compareTo,以便ArrayList键中的字符串根据其HashMap值排序,而不是按字母顺序排序。然而,在这种实现下,字符串仍然按字母顺序排序。 哦,澄清一下,nameWeight是字符串和整数对的哈希映射。 有什么想法吗?

  • 问题内容: 好的,我从很多地方和来源都听说过,每当我覆盖equals()方法时,我也需要覆盖hashCode()方法。但是请考虑以下代码 这里的输出为true,完全按照我想要的方式为false,我根本不关心重写hashCode()方法。这意味着hashCode()覆盖是一种选择,而不是每个人都说的强制性选择。 我想要第二次确认。 问题答案: 它对您有用,因为您的代码未使用任何需要API的功能(Ha

  • 问题内容: 假设我在Java类中有一个方法,并且我不希望该类的任何子类能够覆盖该方法。我可以那样做吗? 问题答案: 您可以将方法声明为,如: 有关更多信息,请参见http://docs.oracle.com/javase/tutorial/java/IandI/final.html

  • 问题内容: 是否有一种标准方法可以在Swift中制作“纯虚函数”,即。一个 必须 由每个子类中被覆盖,并且,如果不是的话,将导致编译时错误? 问题答案: 您有两种选择: 将超类定义为协议而不是类 Pro :编译时检查每个“子类”(不是实际的子类)是否实现了所需的方法 缺点 :“超类”(协议)无法实现方法或属性 2.声明该方法的超级版本 例: Pro :可以在超类中实现方法和属性 缺点 :不检查编译

  • 这是一个更大的项目,所以我将简化结构,不包括这里涉及的所有代码,但我想知道这在概念上是否可行,以及我可能遇到的潜在障碍。 我从主类中得到了几个级别的子类,其中一个级别包含方法age()(从顶部超类重写),该方法调用useEnergy()。此类的直接子类重写age()。该类的直接子类需要重写useEnergy(),但被重写方法中的代码永远不会执行(通过System.out.printlns验证)。有

  • 问题内容: 我希望当子类覆盖父类中的方法时,在该子方法中调用。 有什么办法在编译时检查吗? 如果没有,发生这种情况时,我将如何抛出运行时异常? 问题答案: 无法直接要求这样做。但是,您可以执行以下操作: 这提供了一个内部接口点,子类可以使用该接口将自定义行为添加到public 方法,同时确保无论子类做什么都始终执行超类行为。