Java 泛型 - 重写抽象方法并具有子类的返回类型

2022-09-03 02:09:56

我正在尝试创建一个设置,其中一组子类覆盖一个超类。此超类包含一个抽象方法 - 理想情况下,该方法的返回类型将是从中调用此方法的对象的返回类型,因此它有效地表现如下:

public abstract class SuperClass{
  public abstract SuperClass getSelf();
}

public class SubClass extends SuperClass{
  @Override
  public SubClass getSelf(){
    return this;
  }
}

我不确定这样的事情是否可行,因为我认为返回类型必须始终相同才能使覆盖工作 - 但是我一直在思考答案,如果存在,答案就在这条线上的某个地方......

public abstract class SuperClass{
  public abstract <? extends SuperClass> getSelf();
}

public class SubClass extends SuperClass{
  @Override
  public SubClass getSelf(){
    return this;
  }
}

感谢您的任何帮助。

编辑:添加了将超类扩展到子类,duh


答案 1

这将工作:

public abstract class SuperClass{
  public abstract SuperClass getSelf();
}

public class SubClass extends SuperClass{
  @Override
  public SubClass getSelf(){
    return this;
  }
}

请注意,我已添加到您的定义中。的返回类型称为协变返回类型extends SuperClassSubClassgetSelf


答案 2

怎么样:

public abstract class SuperClass<T extends SuperClass<?>> {
   public abstract T getSelf();
}

public class SubClass extends SuperClass<SubClass> {
     public SubClass getSelf() {
         return this;
     }
}

我知道这是非常重复的,并且没有任何东西将类型限制为相同的实例,因为也会满足绑定,但至少它应该做这个把戏。SubClassAnotherSubClass