我使用Java 1.7和Glassfish 4.0。
有一个通用接口Service<T>
有2个实现,第二个扩展第一个接口。
public interface Service<T>{
void serve(T t);
}
@Singleton @ServiceQualifier(type=ServiceType.DEFAULT)
public class DefaultService implements Service<MyType>{
public void serve(MyType t){
...
}
}
@Singleton @ServiceQualifier(type=ServiceType.SPECIAL)
public class SpecialService extends DefaultService{
@Override
public void serve(MyType t){
...
}
}
为了使用CDI,有一个限定符注释,其中ServiceType
是一个包含ServiceType.DEFAULT
和ServiceType.SPECIAL
的简单枚举。
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
public @interface ServiceQualifier {
ServiceType type();
}
如果像这样注入服务
@Inject @ServiceQualifier(type=ServiceType.DEFAULT)
private Service service;
CDI Container会抛出异常(如果重要的话,我会将应用程序部署到glassfish 4。)
部署期间出错:加载应用时出现异常: CDI部署失败:WELD-001408类型的不满意依赖性 [服务]与限定符[@ServiceQualifier]
但是如果使用通用参数注入服务,它就可以工作。
@Inject @ServiceQualifier(type=ServiceType.DEFAULT)
private Service<MyType> service;
我现在很困惑,因为我认为generic parameters are removed at compile time in Java。有人可以解释为什么有必要指定泛型参数虽然它被编译掉了吗?
提前致谢。
答案 0 :(得分:0)
是的,因为类型参数进入选择范围,所以需要它。您可以将限定符放在任何位置,但如果它不匹配类型,则您无法将bean注入其中。