2011-07-19 34 views
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扩展限定符”的有效替代品?

在此先感谢您的帮助。

回答

4

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

但是,TicketSuccessfulValidation不延伸Qualifier但注释为一。注释不是由泛型评估的。

+1

这就是为什么Josh Bloch在他的第37项中建议我们'使用标记注释来定义类型'而不是注释。没有办法声明一个需要参数具有特定注释的参数。这是一个耻辱。 –