#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. Я слышу тебя. Думаю, мне нужно немного переделать его. Ценю ваши предложения.