项目中出现问题复现,抽象父类的方法调用自己的非抽象方法,如果使用子类想要扩展该抽象方法,参数不能为继承实体类型,会导致子类无法重写父类方法:
1.实体父类
package exOne;
public class BaseEntity {
private String name;
private String code;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
2.子类实体类
package exOne;
public class SonEntity extends BaseEntity {
}
3.抽象方法中有自己的非抽象方法且有实现
package exOne;
public abstract class FatherClass {
public void printMethod() {
BaseEntity BaseEntity = new BaseEntity();
this.selfMethod(BaseEntity);
}
public void selfMethod(BaseEntity BaseEntity) {
System.out.println("父方法打印");
}
}
4.子类方法中想要重写抽象方法的
package exOne;
public class SonClass extends FatherClass {
// 这样重写没有生效且加@Override报错
public void printMethod(SonEntity sonEntity) {
System.out.println("子方法打印");
}
public static void main(String[] args) {
SonClass sonClass = new SonClass();
SonEntity sonEntity = new SonEntity();
sonClass.selfMethod(sonEntity);
}
}
按照以上的方式重写,没有生效且加@Override报错,重写的类型存在问题,只有FatherEntity作为参数才能实现,想到使用泛型,泛型使得子类继承后参数水平扩展并非像父子类的垂直扩展。
抽象方法修改:
package exOne;
public abstract class FatherClass<T extends BaseEntity> {
public void printMethod(T BaseEntity) {
this.selfMethod(BaseEntity);
}
public void selfMethod(T BaseEntity) {
System.out.println("父方法打印");
}
}
子类方法:
package exOne;
public class SonTClass extends FatherClass<SonEntity> {
@Override
public void printMethod(SonEntity BaseEntity) {
System.out.println("子方法打印");
}
public static void main(String[] args) {
SonTClass sonTClass = new SonTClass();
SonEntity sonEntity = new SonEntity();
sonTClass.selfMethod(sonEntity);
}
}
总结:重写父类的方法只能使用泛型水平扩展参数,如果使用子类实体类扩展,会导致无法在子类中重写父类的方法