2015-03-02 64 views
5

的例子中,我有一個類叫做Test和一個叫SubTest誰擴展Text類,我想有一個方法在Test類調​​用的時候誰都會返回SubTest的情況下,我會喜歡做的事:如何使超類方法返回子類

SubTest test = new SubTest().setTest("Hello!").setOtherTest("Hi!"); 

setTest()setOtherTest()方法應該是在Test類。

但是當我做:

public Test setTest(String test) { return this; } 

它只返回Test實例,所以我必須投TestSubTest,但我不想。

可能嗎?如果是,如何?

Thanks,MinusKube。

+0

你的'Test'類是'abstract'嗎? – 2015-03-02 22:11:11

回答

7

有一個方法返回其所有者(this)要能「鏈」多個方法調用叫做流利的API。您可以解決使用仿製藥,你的問題雖然產生的代碼可能是莫名其妙的可讀性,但:

public class Person<T extends Person<T>> { 
    public T setName(String name) { 
     // do anything 
     return (T)this; 
    } 
} 

public class Student extends Person<Student> { 
    public Student setStudentId(String id) { 
     // do anything 
     return this; 
    } 
} 

public class Teacher extends Person<Teacher> { 
    public Teacher setParkingLotId(int id) { 
     // do anything 
     return this; 
    } 
} 

現在,你不需要任何強制轉換:

Student s = new Student().setName("Jessy").setStudentId("1234"); 
Teacher t = new Teacher().setName("Walter").setParkingLotId(17); 

參見:Using Generics To Build Fluent API's In Java

+0

直指點 – pisaruk 2017-11-22 00:27:44

0

有可能讓這些方法返回SubTest,因爲Java的返回類型是協變的。

您必須覆蓋這些方法,這樣就可以返回this,一個SubTest,在SubTest,如:

@Override 
public SubTest setTest(String message) { 
    super.setTest(message); // same functionality 
    return this; 
} 
+0

我是否必須重寫所有類的所有方法? – MinusKube 2015-03-02 22:15:44

+0

是的,否則他們會返回'this'類型爲'Test'。至少重寫是微不足道的。 – rgettman 2015-03-02 22:16:45