2011-09-22 117 views
1

很難用詞來解釋我所追求的內容,但希望下面的代碼示例和註釋足夠。基本上我想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() 

編輯:----------------------------用例場景---------- ---------------------

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()方法以任何順序。與類結構上面你不得不呼籲最後sublcass方法(或使用一個非常醜陋的施法)

+0

是不是就足夠了投它? –

+0

我同意。它應該工作。 – fireshadow52

+0

不,不是用於我打算使用它的用例 – n4rzul

回答

7

你需要做的是這樣的:

public class SuperClass<T> { 

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

} 

public class SubClass extends SuperClass<SubClass> { 

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

} 

你可以閱讀更多關於Java泛型在「Generics Introduction」中,但是簡要地解釋了你告訴SuperClass將返回的實例轉換爲T,這代表了你定義的類型。在這種情況下,它是子類。

+0

您能詳細說明一下嗎? – n4rzul

+0

你是男人。也感謝鏈接。 – n4rzul

+2

不用擔心。如果您正在尋找的是您的「答案」,歡迎您「接受」:-) – sbrattla

0

我認爲你可以使用泛型方法如下所示:

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(); 
    } 
}