为什么CDI需要通用参数?

时间:2014-04-23 09:24:24

标签: glassfish cdi java-ee-7 weld

我使用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.DEFAULTServiceType.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。有人可以解释为什么有必要指定泛型参数虽然它被编译掉了吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

是的,因为类型参数进入选择范围,所以需要它。您可以将限定符放在任何位置,但如果它不匹配类型,则您无法将bean注入其中。