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

Java 我需要覆盖子类中的CompareTo方法,java,generics,comparable,Java,Generics,Comparable,我有一个实现可比较接口的类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;

我有一个实现可比较接口的类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;
}
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;
    }
公共类A实现了可比性{
串姓;
智力年龄;
A(字符串姓氏,整数年龄){
this.姓氏=姓氏;
这个。年龄=年龄;
}
公共内部比较(E/o){
int res=0;
res=这个姓氏。与(o.姓氏)相比;
如果(res==0)
res=这个年龄-o年龄;
返回res;
}
B类:

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;
}
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;
    }
公共类B扩展了{
int-num;
学生(字符串姓氏,整数年龄,整数){
超级(姓氏、年龄);
this.num=num;
}
@凌驾
公共国际比较(B o){
int res=0;
res=这个姓氏。与(o.姓氏)相比;
如果(res==0)
res=这个年龄-o年龄;
如果(res==0){
res=this.num-o.num;
}
返回res;
}
例外情况:

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;
}
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在的未命名模块中) 加载程序“应用程序”)


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

你能发布失败的代码吗

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

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

Student!=B


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

谢谢你的评论,我添加了@Override,但没有help@ConnorRuggles,这不会有什么帮助。注释与Java中的重写无关。该方法已被重写。@LaksithaRanasingha它不会解决问题,但注释当然有问题重写操作:/@DaveNewton我不这么认为。我指的是重写的概念。这是一个运行时操作,无论有没有注释,它都保持不变。只要方法签名和返回类型是相同的重写,那么它就不会工作。当然,注释提供编译时安全性。因此它是相关的。说它是“无关”是胡说八道;正如你所说的,它是直接相关的。正如我所说的,它不是必需的,但它显然与定义重写有关。你得到classcastexception的代码片段是什么?这个示例可以正常工作,没有这样的异常。你是否尝试像'B=(A)A;检查[java.lang.classcastexception](),您的代码似乎对我也很好,也许您调用类的方式是错误的