Почему общий параметр необходим в CDI?

Я использую Java 1.7 и Glassfish 4.0.

Существует общий интерфейс Service<T> с двумя реализациями, где вторая расширяет первую.

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 выдает исключение (я развертываю приложение на Glassfish 4, если это имеет значение).

Ошибка при развертывании: исключение при загрузке приложения: ошибка развертывания CDI: WELD-001408 Неудовлетворенные зависимости для типа [Service] с квалификаторами [@ServiceQualifier]

Но если Служба вводится с общим параметром, она работает.

@Inject @ServiceQualifier(type=ServiceType.DEFAULT)
private Service<MyType> service;

Сейчас я очень запутался, потому что думал, что общие параметры удален во время компиляции в Java. Может кто-нибудь объяснить, почему необходимо указывать общий параметр, хотя он скомпилирован?

Заранее спасибо.


person FuryFart    schedule 23.04.2014    source источник


Ответы (1)


Да, это необходимо, так как параметр типа входит в выбор. Вы можете поместить квалификатор куда угодно, но если он не соответствует типу, вы не сможете внедрить в него bean-компонент.

person John Ament    schedule 23.04.2014
comment
Джон прав. Стирание универсального типа Whatsmore не мешает Weld использовать отражение во время выполнения для получения общих типов параметров. - person maxmil; 28.04.2014