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)

如果我删除通配符,那么它可以编译并正常工作。为变量声明类型参数的正确方法是validatorClass什么?

谢谢。

4

1 回答 1

2

? extends Annotation表示“注解的未知子类型”,它不同于“注解的任何子类型”。

该方法的初始化需要“Annotation 的未知子类型”,在某些时候表示未知子类型现在称为AnotherAnnotation,并且您正在尝试传递 Annotation 类的对象,该对象可能不是的类型,AnotherAnnotation因此它们是不兼容的。

类似的问题在这里得到了回答。

于 2010-12-29T02:37:54.640 回答