Компоненты автоматической проводки с общими типизированными параметрами во время выполнения

#java #spring-boot #generics #type-safety

#java #весенняя загрузка #общие #безопасность типов

Вопрос:

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

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

 @Component
@RequiredArgsConstructor
@Scope(value = "prototype")
public class Bar<T> extends Foo<T> {

private final Utility utility;

public Bar<T> init(String a, int b) {
    //initializations
}

//some more methods

}
 

На мой взгляд, я могу подключить класс, используя ApplicationContext примерно так,

 Foo<Detail> foo = applicationContext.getBean(Bar.class).init(a,b);
 

Но это выдает предупреждение,

 Type safety: The expression of type Bar needs unchecked conversion to conform to Foo<Detail>.
 

Теперь я понимаю, что эта проблема связана с тем, что я не упомянул типизированный параметр при инициализации компонента Bar класса using ApplicationContext .

Question is, what might be the right syntax to mention the typed parameter <Detail> in the above statement?

Ответ №1:

Я думаю, что-то вроде этого:

 String [] names = context.getBeanNamesForType(ResolvableType.forClassWithGenerics(Bar.class, Detail.class));
Foo<Detail> bar = context.getBean(names[0]);
 

Комментарии:

1. Это тоже не работает, приятель. Кажется, я забыл упомянуть, что Detail это не управляемый компонент spring, а обычный старый класс Java bean. Есть ли у вас какой-либо альтернативный обходной путь на этот случай?

2. @AJC я понимаю. Дело в том, что вы помещаете (через @Component ) в контекст spring компонент, который является универсальным Bar<T> . Единственный способ получить его — это использовать context.getBeanNamesForType(ResolvableType.forClass(TestConfig.Bar.class)) или context.getBeanNamesForType(ResolvableType.forClassWithGenerics(TestConfig.Bar.class, Object.class)); . Обычно все наоборот: вы определяете универсальный интерфейс и добавляете 2 или более универсальных компонентов Spring, которые реализуют этот интерфейс.

3. Я слышу тебя. Думаю, мне нужно немного переделать его. Ценю ваши предложения.