2011-07-19 5 views
0

こんにちは、私はWeld(CDI)イベントに基づくEventBuilderを実装しようとしています。Generics and Qualifiers

私は、パラメータqualifierClassをinfをespecified(選ばれた修飾子を指定して、私のイベントを構築するには、次のメソッドを作成し

@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 extends Qualifier"の代用として有効ではないのですか?

ご協力いただきありがとうございます。

答えて

4

Q extends Qualifierは明らかにあなたが渡すクラスがQualifierを拡張しなければならないことを意味します。 :)

しかし、TicketSuccessfulValidationQualifierを拡張しませんが、1つのように注釈を付けています。注釈はジェネリックスによって評価されません。

+1

これは、アノテーションではなく、「マーカーアノテーションを使用してタイプを定義する」という彼の項目37で、Josh Blochがアドバイスしている理由です。引数に特定の注釈を付ける必要があるパラメータを宣言する方法はありません。それは残念です。 –