Создание универсального типа с использованием Spring Config - PullRequest
4 голосов
/ 30 ноября 2009

Как создать экземпляр компонента с универсальным типом, используя конфигурацию Spring

public class GenericService<T> 
{
 ...
}

Обратите внимание, что T не является конкретным типом свойства бина. Это действительно просто тип для одного из методов службы.

Другими словами .. Могу ли я создать новый GenericService типа String или новый GenericService типа Long с помощью контекста Spring.

Мой общий класс содержит

public <T extends WordplayService> List<S> performTheService(String word, Class<T> clazz) 
{ 
    return clazz.newInstance().getAllWords(); 
    ...
}

Тип возвращаемого значения универсального метода зависит от конкретного типа параметра создаваемого класса. Возможно ли это или неправильное использование обобщений DI +? ТИА

Ответы [ 4 ]

11 голосов
/ 30 ноября 2009

Обобщения являются концепцией времени компиляции, в то время как весенний контекст загружается во время выполнения, поэтому они не пересекаются. Что именно вы пытаетесь достичь? Какой у вас вариант использования.

3 голосов
/ 08 сентября 2010

Вы можете безопасно использовать DI с генериками, потому что, как я уже сказал, генерики теряются в момент введения зависимостей.

Обобщения являются концепцией времени компиляции ...

По правде говоря, общая информация не (полностью) стирается во время компиляции. Вы все еще можете получить эту информацию с помощью отражения, и это то, что контейнер Spring DI уже делает для коллекций. См. 3.3.3.4.2. Строго типизированная коллекция (только Java 5+) в документации 2.0.8 Spring (извините, можно размещать только одну гиперссылку).

Однако я не знаю (пока), можно ли поручить контейнеру сделать это и для ваших пользовательских классов.

Если вы хотите узнать, как получить эту информацию во время выполнения, вот оригинальный пост Нила Гафтера: http://gafter.blogspot.com/2006/12/super-type-tokens.html

1 голос
/ 30 ноября 2009

Вы должны просто создать его экземпляр, используя необработанное имя класса. Как говорит @Bozho, дженерики являются конструкцией только во время компиляции, а их полные типы недоступны во время выполнения.

0 голосов
/ 05 декабря 2012

Ни один из ответов не показывает никаких примеров, это просто:

@Resource
private CommentService<String> stringCommentService;

@Resource
private CommentService<Integer> integerCommentService;

@Test
public void genericTest(){
    System.out.println("Generic test .... :");
    stringCommentService.printType("test");

    System.out.println("INT Generic test .... :");
    integerCommentService.printType(9);

}

Где commentservice выглядит так, как вы себе представляете:

@Service
public class CommentService<T> {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...