0
嗨即时尝试实施基于焊接(CDI)事件的EventBuilder。泛型和限定符
我创建了下面的方法与所选择的预选赛打造我的事件(especified INF参数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其不正确地说,是扩展预选赛?为什么TicketSuccessfulValidation不是“Q扩展限定符”的有效替代品?
在此先感谢您的帮助。
这就是为什么Josh Bloch在他的第37项中建议我们'使用标记注释来定义类型'而不是注释。没有办法声明一个需要参数具有特定注释的参数。这是一个耻辱。 –