Дженерики и Квалификаторы - PullRequest
0 голосов
/ 19 июля 2011

Здравствуйте, я пытаюсь реализовать EventBuilder на основе событий сварки (CDI).

Я создал следующий метод для создания своего события с выбранным квалификатором (указывается в параметре qualifierClass.

@SuppressWarnings("serial")
public static <T extends custom.Event, Q extends Qualifier> 
    Event<T> buildEvent(Event<T> event, Class<Q> qualifierClass) {

    return event.select(new AnnotationLiteral<Q>(){});
}

Мой классификатор имеет следующий код:

@Qualifier 
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface TicketSuccessfulValidation {

}

Затем я пытаюсь использовать метод так:

@Inject Event<TicketEvent> event;

private Map<String, User> loggedUsers = new HashMap<String, User>(0);

public User retrieveUserByTicket(String ticket) {
    User user = this.loggedUsers.get(ticket);
    if (user != null) {
        buildEvent(event, TicketSuccessfulValidation.class).fire(new TicketEvent("12345"));
        return user;

    } else {
        throw new TicketNotFoundException();
    }
}

Затем мое затмение дает мне следующее сообщение:

Bound mismatch: The generic method buildEvent(Event<T>, Class<Q>) of type AbstractEventBuilder is not applicable for the arguments (Event<TicketEvent>, Class<TicketSuccessfulValidation>). The inferred type TicketSuccessfulValidation is not a valid substitute for the bounded parameter <Q extends Qualifier>

Если моя TicketSuccessfulValidation помечена @Qualifier, то неправильно говорить, что она расширяет Qualifier? Почему TicketSuccessfulValidation не является допустимой заменой «Q extends Qualifier»?

Заранее спасибо за любую помощь.

1 Ответ

4 голосов
/ 19 июля 2011

Q extends Qualifier, очевидно, означает, что класс, который вы проходите, должен расширяться Qualifier.:)

Однако TicketSuccessfulValidation не расширяет Qualifier, но помечается как единое.Аннотации не оцениваются Generics.

...