Java Generics接口和Spring GetBean的Id和Class类型

时间:2013-01-16 07:47:13

标签: java spring generics

我有一个通用接口,我可以提供很多实现,对于每个这样的实现,我在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);

如果我有人能够确定我在这里做错了什么,我会很有帮助。

2 个答案:

答案 0 :(得分:1)

除了压制它之外你不能除去那个警告。这是因为Java泛型中的运行时类型擦除。类文字IConfigurationService.class不提供任何通用类型信息。因此,您从IConfigurationService<?>返回了context.getBean。你必须将它转换为适当的类型。

但您可以使用解决方法。当你宣布

@Resource
private IConfigrationService<Foo> configService;

在你的一个spring上下文托管类中,spring将确保只注入IConfigurationService的实现,其类型参数与Foo兼容。

答案 1 :(得分:-1)

所以你有一个接口有很多实现吗?为什么不在每个实现中使用@Qualifier,并在使用@Resource注入实现时使用限定符?