2012-04-17 3 views
2

Может ли кто-нибудь опубликовать Java-версию этого кода VB.NET?Завод дженериков в 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 и создает его экземпляр? –

+0

Как вы хотите, чтобы он определил, какой класс вам действительно нужен? –

+0

Невозможно сделать это без аргумента Class в Java. –

ответ

2

Вы не можете создать экземпляр в Java без экземпляра Class, чтобы указать, к какому классу принадлежит экземпляр, за исключением анонимных классов (см. Ниже). Вы можете получить этот экземпляр класса в качестве параметра или скрыть его под скалой или выловить его из океана, но вы должны иметь его во время выполнения. Классы, связанные с генериками, удаляются стиранием типа, и их просто нет.

Я не знаю VB.NET из струнных лучей, но в некоторых случаях вы можете искать анонимный класс.

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

В этом случае есть быть не <T> вообще, тип возврата не будет просто IRepoDocument.

+0

О, да, я не думал. – bmargulies

+0

Нет, это просто: если вы не передаете аргумент типа-тега, для этого метода нет способа узнать, какой тип вы хотите создать. Речь идет не о каких-либо правилах поведения. –

+0

Я думал об общем случае, в котором аргумент класса используется, чтобы избежать приведения, а не для newInstance. Исправлена. – bmargulies