2012-04-17 103 views
2

任何人都可以發佈此VB.NET代碼的Java版本嗎?Java中的泛型工廠

Public Function FetchDoc(Of T As {New, IRepoDocument})(ByVal docId As String) As IRepoDocument Implements IDocRepository.FetchDoc 

     Dim repoDoc As New T 

     //some code to init repoDoc 

     Return repoDoc 

    End Function 

這個函數接受和創造實現IRepoDocument任何類的實例,並且有一個無參數的構造函數。

我發現的唯一方法是:

public <T extends IRepoDocument> IRepoDocument FetchDoc(String idDoc, Class<T> clazz) 
    throws InstantiationException, IllegalAccessException 
{ 
    return clazz.newInstance(); 
} 

但我想抑制Class<T> clazz作爲輸入參數。

+1

所以你想要在ClassLoader中搜索任何實現IRepoDocument並實例化它的類? – 2012-04-17 12:39:08

+0

你想如何確定你真正想要的課程? – 2012-04-17 12:41:59

+0

如果沒有Java中的Class參數,沒有辦法做到這一點。 – 2012-04-17 12:42:24

回答

2

如果沒有Class實例,您不能創建Java實例來指定實例所屬的類 - 匿名類除外(請參見下文)。您可以將該類實例作爲參數獲取,或將其隱藏在岩石下,或將其捕獲到海洋外,但您必須在運行時上運行。與泛型相關的類通過類型擦除被刪除,但不存在。

我不知道stringbeans的VB.NET,但在某些情況下,您可能會尋找一個匿名類。

new IRepoDocument() { ......fill in code }; 

在這種情況下,有沒有<T>可言,返回類型也只是IRepoDocument。

+0

哦,啞吧,我沒在想。 – bmargulies 2012-04-17 12:49:59

+0

不,這很簡單:如果您沒有傳入類型標記參數,那麼該方法無法找出想要實例化的類型。這不是遵循任何行爲規則。 – 2012-04-17 12:51:06

+0

我在考慮使用類參數來避免轉換,而不是newInstance的常見情況。固定。 – bmargulies 2012-04-17 12:52:29