2011-01-20 98 views
91

我一直在使用Guice的AOP来拦截一些方法调用。我的类实现了一个接口,我想注释接口方法,所以Guice可以选择正确的方法。即使注释类型标注有Inherited注释实现类在继承的Java文档表示不继承注释:为什么java类不会从已实现的接口继承注释?

还要注意的是这个元注释 不仅会导致注释是 从超继承; 已实施的接口上的注释 不起作用。

这可能是什么原因?了解对象类在运行时实现的所有接口并不是那么难,因此决定背后必须有一个很好的理由。

回答

109

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

例子:

@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'?


由于这个原因,接口上的注释很少有用。

+8

接口上的注释仅在您有支持它们的框架时才有用。在这个例子中的BTW getAnnotation()返回null;) – 2011-01-20 10:41:23

+5

我不知道,人。在这种情况下(如果错字不存在),我期望一个'字段值是不明确的类似于编译器错误,就像两个接口声明相同的常量与不同的值。我知道这不是一个字段,但注解值在编译时全部解决,不是吗?我们在这里丢失的功能在很多情况下都会超级有用。对不起,关于恢复一个旧帖子,顺便说一句:)。 – 2012-04-20 09:25:07

29

Javadoc为@Inherited:

指示注释类型被自动继承。如果 继承元注释存在于注释类型 声明,并且用户查询上一类 声明注释类型,类声明没有注解此 类型,那么类的父类将自动查询了 注释类型。此过程将重复进行,直到找到此类型的注释 ,或者达到类层次结构(对象)的顶部为 。如果没有超类具有此类型的注释,则 查询将指示所讨论的类没有这种注释。 请注意,如果注释的 类型用于注释除类之外的其他任何内容,则此元注释类型不起作用。还要注意, 这个元注释只会导致注释从 超类继承;已实现的接口上的注释不起作用。

另一方面,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元注释。

相关问题