Общий тип Java и отражение - PullRequest
1 голос
/ 29 декабря 2010

У меня есть какая-то хитрая проблема типового типа, связанная с отражением.Вот код.

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)

Если я удаляю подстановочные знаки, то он компилируется и работает нормально,Каков был бы правильный способ объявить параметр типа для переменной validatorClass?

Спасибо.

1 Ответ

2 голосов
/ 29 декабря 2010

? extends Annotation означает «неизвестный подтип аннотации», который отличается от «любого подтипа аннотации».

Для инициализации метода требуется «неизвестный подтип аннотации», в какой-то момент говорится о неизвестном подтипетеперь известен как AnotherAnnotation, и вы пытаетесь передать объект класса Annotation, который может не относиться к типу AnotherAnnotation, поэтому они несовместимы.

На этот же вопрос был дан ответ здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...