泛型和限定符

时间:2011-07-19 12:34:13

标签: java generics java-ee cdi

我正在尝试实现基于焊接(CDI)事件的EventBuilder。

我创建了以下方法来使用所选的限定符来构建我的事件(在参数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>

如果使用@Qualifier注释我的TicketSuccessfulValidation,那么它是不是说扩展限定符?为什么TicketSuccessfulValidation不能替代“Q extends Qualifier”?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

Q extends Qualifier显然意味着您传递的课程必须延长Qualifier。 :)

但是,TicketSuccessfulValidation不会扩展Qualifier,但会注释为1。 Generics不会对注释进行评估。