Java 我需要覆盖子类中的CompareTo方法
我有一个实现可比较接口的类a,还有一个扩展了a的类B。我需要找到一种方法在类B中覆盖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;
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](),您的代码似乎对我也很好,也许您调用类的方式是错误的