Как я могу создать экземпляр типа динамически в Java - PullRequest
2 голосов
/ 09 октября 2009

В моем приложении Java у меня есть метод

public <T extends Transaction> boolean appendTransaction(T transaction) {
   ...
}

и внутри этого метода мне нужно создать экземпляр объекта T , который расширяет Транзакция

Правильно ли сделать это таким образом

T newTransaction = (T) transaction.getClass().newInstance();

Ответы [ 2 ]

5 голосов
/ 09 октября 2009

Я думаю, вы должны использовать фабричный интерфейс типа T, чтобы вы могли принудительно вызвать интерфейс create-instance для метода-пользователя.

public <T extends Transaction> boolean appendTransaction(
        T transaction, 
        Factory<T> factory) {
    ...
    T newTransaction = factory.createTransaction();
    ...
}
2 голосов
/ 09 октября 2009

Более или менее, за исключением того, что Class.newInstance является злом:

Обратите внимание, что этот метод распространяет любое исключение, выданное нулевым конструктором, включая проверенное исключение. Использование этого метода эффективно обходит проверку исключений во время компиляции, которая в противном случае выполнялась бы компилятором.

Вместо этого используйте transaction.getClass().getConstructor().newInstance(), в него включаются исключения, брошенные в конструктор, с InvocationTargetException.

...