我有一个通用接口,我可以提供很多实现,对于每个这样的实现,我在spring定义文件中关联一个id属性。
IConfigurationService<T>
现在我正在尝试编写一个实用程序方法,它可以通过id获取实现。
以下方法是一种实用方法,它会向我发出警告信息:
public <T extends Serializable> IConfigurationService<T> getBean(Class<T> type, String id){
return (IConfigurationService<T>)context.getBean(id, IConfigurationService.class);
}
警告讯息: 类型安全:从IConfigurationService取消选中强制转换为IConfigurationService。
如何摆脱此警告消息?
如果我按如下方式更改return语句,那么我收到编译错误:
return (IConfigurationService<T>)context.getBean(id, IConfigurationService<T>.class);
如果我有人能够确定我在这里做错了什么,我会很有帮助。
答案 0 :(得分:1)
除了压制它之外你不能除去那个警告。这是因为Java泛型中的运行时类型擦除。类文字IConfigurationService.class
不提供任何通用类型信息。因此,您从IConfigurationService<?>
返回了context.getBean
。你必须将它转换为适当的类型。
但您可以使用解决方法。当你宣布
时@Resource
private IConfigrationService<Foo> configService;
在你的一个spring上下文托管类中,spring将确保只注入IConfigurationService
的实现,其类型参数与Foo
兼容。
答案 1 :(得分:-1)
所以你有一个接口有很多实现吗?为什么不在每个实现中使用@Qualifier,并在使用@Resource注入实现时使用限定符?