父类返回子类

n4r*_*zul 1 java polymorphism inheritance

很难用语言解释我所追求的内容,但希望下面的代码示例带有注释就足够了.基本上我希望该SubClass sc = new Subclass().method1()行返回Subclass实例.

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()
Run Code Online (Sandbox Code Playgroud)

编辑:----------------------------用例场景------------------ -------------

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
Run Code Online (Sandbox Code Playgroud)

你要注意的第一件事是sbrattla方式允许我以任何顺序调用这些.audDate().xxx()方法.使用上面的类构造,你被迫最后调用sublcass上的方法(或使用一个非常丑陋的演员)

sbr*_*tla 8

您需要执行以下操作:

public class SuperClass<T> {

  public T method1() {
    return (T) this;
  }

}

public class SubClass extends SuperClass<SubClass> {

  public SubClass method2() {
    return (SubClass) this;
  }

}
Run Code Online (Sandbox Code Playgroud)

您可以在" 泛型简介 "中阅读有关Java泛型的更多信息,但简要说明您告诉SuperClass将返回的实例强制转换为表示您定义的类型的T. 在这种情况下,它是SubClass.

  • 别担心.如果你正在寻找的话,非常欢迎你"接受"我的答案:-) (2认同)