2

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

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

4

2 回答 2

1

除了压制它之外,您无法摆脱该警告。这是因为 Java 泛型中的运行时类型擦除。类文字IConfigurationService.class不提供任何通用类型信息。所以你得到一个IConfigurationService<?>context.getBean. 您必须将其转换为适当的类型。

但是您可能会为此使用解决方法。当你声明

@Resource
private IConfigrationService<Foo> configService;

在您的一个 spring 上下文管理类中,spring 将确保只注入IConfigurationService其类型参数与Foo.

于 2013-01-16T07:57:36.190 回答
-1

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

于 2013-01-16T08:35:53.930 回答