2013-10-08 31 views
2

預信息的任何類型。如何創建法的返回類型的超

public abstract class Person {} 
public class A extends Person{} 
public class B extends Person{} 
public class C extends Person{} 

public X getPersonByType(String type){ 
    //This Method will return either A or B or C based on type 
    //what should X be ?  
} 

我需要創建這需要在一個String並返回一個對象,它是的Person一個亞型的方法。

更多信息。 每個類A B C都有一個屬性public List角色。這些不能移動到Person類,因爲我需要這些唯一命名的(JPA多對多表)。

現在,如果可能,我不希望它返回person,因爲我無法訪問roles屬性(Person不知道它)。我也更喜歡一個解決方案(如果可能的話),它不需要我投入或使用instanceOf(如果可能,再次使用)。

P.S試圖<? extends Person>但是Eclipse給我

+9

讓它返回'Person'。 –

+0

請參閱[泛型](http://docs.oracle.com/javase/tutorial/extra/generics/index.html)和[通配符](http://docs.oracle.com/javase/tutorial/extra/generics /wildcards.html) – Justin

+1

@gangqinlaohu:沒有跡象表明泛型在這裏是合適的。 –

回答

1

您應該返回Person X。由於Person是一個抽象類型,因此不能被實例化。你可以有Person X作爲reference,它應該指向Person的任何具體實現的對象,它們是AB & C你的情況。這是run time polymorphism的美麗。根據您在運行時的輸入,它會創建一個,BC類中的任意一個的object,並使用參考X來指向該對象。我建議您通過Factory Design Pattern,這將爲您提供有關此類型的更多信息現實生活中的設計作品。

+0

好的建議。我曾經在考慮使用泛型,但這是一個很好的簡單解決方案。 Thx,它工作。 – SpartanElite

1

X應該Person錯誤 「缺少方法的返回類型」。

因爲Person是一個抽象類,不能實例化它將永遠返回你的一個子類型。

如果你需要知道什麼getPersonByType從調用方法返回時,你可以使用instanceof操作

3

public Person getPersonByType(String type)應該能正常運行,因爲所有的返回類型擴展Person

,如果你想避免調用此方法後instanceof檢查您還可以添加額外的類參數:

public <T extends Person> T getPersonByType(String type, Class<T> type) { 
    ... 
    // cast result to T 
} 

使用這種方式,您將能夠返回類型分配給直接的子類:

C c = getPersonByType("c", C.class); 

請注意,如果您傳入的String和Class參數彼此不匹配,則可能導致ClassCastExceptions

+0

正確的聲明是:'public T getPersonByType(String type,Class type){...}' – JMess

+0

@Jess,謝謝,更新我的回答 – micha

1
public Person getPersonByType(String type){ 
// analyze type and return appropriate instance... 
    if ("A instance".equals(type)) { 
     return new A(); 
    } 
... 

} 
相關問題