父类返回子类



很难用语言解释我所追求的,但希望下面的代码示例和注释是足够的。基本上,我希望SubClass sc = new Subclass().method1()行返回子类实例。

public class SuperClass {
    public SuperClass method1()
    {
       //do whatever
       return this
    }
}
public class SubClass extends SuperClass {
    //we inherit method 1
    //method2
    public SubClass method2()
    {
       //do whatever
       return this
    }
}
//succesfully returns instance of Sublass, but...
SubClass sc = new Subclass().method2() 
//...the following line returns an instance of SuperClass and not Sublass
//I want Sublass's instance, without having to using overides
//Is this possible?
SubClass sc = new Subclass().method1()

编辑 : ---------------------------- usecase场景 -------------------------------

Message myMessage =  new ReverseTransactionMessageBuilder()
                    .policyNo(POLICY_NO) //on ReverseTransactionMessageBuilder
                    .audUserId(AUD_USER_ID) //on inherited MessageBuilder
                    .audDate(new Date()) //on inherited MessageBuilder
                    .processNo(EProcessConstants.FINANCE_MANUAL_ADJUSTMENT.getProcessCd()) //on inherited MessageBuilder
                    .serviceName("finance.ProcessReversalCmd") //on inherited MessageBuilder
                    .create(); //create is overridden so this is ReverseTransactionMessageBuilder

首先你会注意到,sbrattla方法允许我以任何顺序调用这些。auddate () .xxx()方法。使用上面的类构造,您必须最后在子类上调用该方法(或者使用非常难看的强制转换)

您需要这样做:

public class SuperClass<T> {
  public T method1() {
    return (T) this;
  }
}
public class SubClass extends SuperClass<SubClass> {
  public SubClass method2() {
    return (SubClass) this;
  }
}

您可以在"泛型介绍"中阅读更多关于Java泛型的内容,但简要解释了您告诉SuperClass将返回的实例强制转换为代表您定义的类型的T。在本例中,它是SubClass.

我认为你可以像这样使用泛型方法:

class Parent {
  public <T extends Parent> T instance() {
    return (T) this;
  }
}
class Child extends Parent {
}
class Test {
  public static void main() {
    Child child = new Parent().instance();
  }
}

最新更新