具有注释注释的注释的泛型

时间:2015-01-22 22:33:50

标签: java generics interface annotations

我正在尝试这样做,我有一些" base"注释

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface A
{

}

我有注释B,注释为A

@A
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface B {

    String value();
}

我希望界面的行为类似于此,确保T是由A注释的注释。

interface SomeInterface<T extends A>
{
    void method(T argument);
}

所以我实现了像这样的东西

public class Implementation implements SomeInterface<B>
{
    public void method(B argument);
}

怎么做?当我使用&#34; T延伸A&#34;在SomeInterface中,当我实现它时,它说B不是有效的替代。

谢谢!

2 个答案:

答案 0 :(得分:3)

B不是<T extends A>的有效替代,因为B不会延伸A

Java没有包含要求泛型类型参数具有特定注释的方法。

如果您可以将SomeInterface重构为类而不是接口,则可以在构造函数中进行运行时检查:

protected SomeInterface(Class<T> classOfT) {
    if(classOfT.getAnnotation(A.class) == null)
        throw new RuntimeException("T must be annotated with @A");
}

答案 1 :(得分:2)

Java中无法进行注释继承。

你所写的只是一个由另一个注释注释的注释,而不是一个扩展另一个注释的注释。

如果注释继承是可能的,我想它会是这样的:

public @interface B extends A {

    String value();
}

但它不存在。

同时检查此link和此link