【发布时间】:2014-09-29 15:31:00
【问题描述】:
升级 Spring 3.2 -> 4.1 时遇到以下问题
有一个Metadata 层次结构,例如:AMetadata extends Metadata,
BMetadata extends Metadata等
有一个Processor 层次结构,比如:
abstract Processor<M extends Metadata>,
AProcessor extends Processor<AMetadata>,
BProcessor extends Processor<BMetadata> 等
有一个服务包含注入的处理器List,如下所示:
@Inject
private List<Processor<Metadata>> processors;
虽然这在 Spring 3.2 中完美运行,但在 Spring 4.1.0(以及 4.0 中)它无法注入列表成员。进入调试,发现:
Processor<Metadata>.isAssignableFrom(BProcessor) == false,这会导致处理器 bean 无法匹配为符合条件的注入候选者。
一个可能看起来像 hack 的解决方案是声明处理器如下:
BProcessor<Metadata> extends Processor<BMetadata> - 可行,但看起来有点奇怪。另一种选择是使用List<Processor<? extends Metadata>>,但这需要在其他地方进行一些代码更改才能编译,并在依赖泛型的类中导致大量类型安全检查警告。
那么问题来了,如何正确处理这种情况?有没有人遇到过类似的情况?
【问题讨论】:
标签: java spring list generics dependency-injection