2012-04-17 81 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