2008-12-11 88 views
2

如果我有一個基類,使得是否有可能編寫一個返回T類對象的方法?

public abstract class XMLSubscription <T extends XMLMessage> 

是否有可能在寫一個XMLSubscription方法,返回T的類對象?

,我想出的唯一可能的解決辦法是讓XMLSubscription的每個後代有一個方法,如:

public class XMLStatusSubscription extends XMLSubscription<XMLStatusMessage> 
{ 
    public Class <XMLStatusMessage> getExpectedMessageType() 
    {   
    return XMLStatusMessage.class; 
    } 
} 
+0

你可以修改你的問題標題,以更多地反映你的通用問題?像,你能指定一個擴展類的泛型類型,或者...類似的東西嗎?有人尋找類似的東西不會被你的問題標題幫助。 – mmcdole 2008-12-11 22:45:28

+0

可能「我可以返回Java類的類類型嗎?」 – 2008-12-11 22:46:39

+0

好的建議,我想不出如何解釋這個問題,謝謝! – darrickc 2008-12-11 23:03:26

回答

4

不幸的是 - 是的,這是由於類型擦除 - 沒有辦法返回而不是在運行時提供它的Class對象。

幸運的是,這通常不是太困難。下面是我通常完成這個/看到它完成的方式:

public abstract class XMLSubscription <T extends XMLMessage> { 
    private Class<T> messageType; 

    protected XMLSubscription(Class<T> messageType) { 
     this.messageType = messageType; 
    } 

    public Class<T> getExpectedMessageType() { 
     return this.messageType; 
    } 
} 

public class XMLStatusSubscription extends XMLSubscription<XMLStatusMessage> { 

    public XMLStatusSubscription() { 
     super(XMLStatusMessage.class); 
    } 
} 
0

正如你猜測的,T被編譯器擦除。當你實例化對象時,它不知道它應該處理XMLStatusMessage對象。基類將定義以下模板法和1.5的協變返回類型將保持編譯器高興的具體子類:

public Class<T> getExpectedMessageType() 

有一個元註釋:這看起來很像程序代碼,其中東西叫getExpectedMessageType(),然後根據返回類型採取行動。這可能會更好地使用訪問者模式實現,訪問者針對XMLMessage的每個子類實現「doSomething」方法。

相關問題