1

リフレクションを含むトリッキーなジェネリック型の問題があります。これがコードです。

public @interface MyConstraint {
    Class<? extends MyConstraintValidator<?>> validatedBy();
}

public interface MyConstraintValidator<T extends Annotation> {
    void initialize(T annotation);
}

/**
    @param annotation is annotated with MyConstraint.
*/
public void run(Annotation annotation) {
    Class<? extends MyConstraintValidator<? extends Annotation>> validatorClass = annotation.annotationType().getAnnotation(MyConstraint.class).validatedBy();
    validatorClass.newInstance().initialize(annotation) // will not compile!
}

上記のrun()メソッドは、次のエラーのためにコンパイルされません。

The method initialize(capture#10-of ? extends Annotation) in the type MyConstraintValidator<capture#10-of ? extends Annotation> is not applicable for the arguments (Annotation)

ワイルドカードを削除すると、コンパイルされて正常に動作します。vairableのtypeパラメーターを宣言する適切な方法は何でしょうvalidatorClassか?

ありがとう。

4

1 に答える 1

2

? extends Annotation「注釈の不明なサブタイプ」を意味し、「注釈の任意のサブタイプ」とは異なります。

メソッドの初期化には「Annotationの不明なサブタイプ」が必要であり、ある時点で不明なサブタイプがとして知られるようAnotherAnnotationになり、タイプではない可能性があるAnnotationクラスのオブジェクトを渡そうとしているため互換性がありませんAnotherAnnotation

同様の質問がここで答えられました。

于 2010-12-29T02:37:54.640 に答える