为什么java类不从已实现的接口继承注释?

时间:2011-01-20 10:12:24

标签: java inheritance interface annotations guice

我一直在使用Guice的AOP来拦截一些方法调用。我的类实现了一个接口,我想注释接口方法,以便Guice可以选择正确的方法。即使注释类型使用Inherited注释注释,实现类也不会继承注释,如Inherited的java doc中所述:

  

还要注意这个元注释   只会导致注释   继承自超类;   已实现接口上的注释   没有效果。

这可能是什么原因?了解对象类在运行时实现的所有接口并不是一件难事,因此必须有充分的理由支持这一决定。

2 个答案:

答案 0 :(得分:122)

我说原因是否则会出现多重继承问题。

示例:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) @Inherited
public @interface Baz { String value(); }

public interface Foo{
    @Baz("baz") void doStuff();
}

public interface Bar{
    @Baz("phleem") void doStuff();
}

public class Flipp{
    @Baz("flopp") public void doStuff(){}
}

public class MyClass extends Flipp implements Foo, Bar{}

如果我这样做:

MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value()

结果会是什么? 'baz','phleem'或'flopp'?


因此,接口上的注释很少有用。

答案 1 :(得分:31)

来自Javadoc @Inherited:

  

表示自动继承注释类型。如果   继承的元注释存在于注释类型上   声明,用户查询类的注释类型   声明,类声明没有注释   类型,然后将自动查询类的超类   注释类型。将重复此过程直到注释   找到此类型,或者类层次结构(Object)的顶部是   到达。如果没有超类具有此类型的注释,那么   查询将指示有问题的类没有这样的注释。   请注意,如果带注释,则此元注释类型无效   type用于注释除类之外的任何内容。另请注意   这个元注释只会导致注释继承自   超;已实现的接口上的注释无效。

另一方面,JSR 305验证器执行某种继承查找。如果您有类的层次结构:

//Person.java
@Nonnull
 public Integer getAge() {...}

//Student.java (inherits from Person)
@Min(5)
public Integer getAge() {...}

然后Student.getAge()上的有效验证为@Nonnull @Min(5)@Nonnull没有@Inherited元注释。