首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么java类不继承已实现接口的注解?

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

Stack Overflow用户
提问于 2011-01-20 18:12:24
回答 2查看 65.1K关注 0票数 115

我正在使用一个依赖注入框架(Guice的AOP专门用来拦截一些方法调用)。我的类实现了一个接口,我想对接口方法进行注释,这样框架就可以选择正确的方法。即使注释类型是用Inherited注释来注释的,实现类也不会像继承的java文档中所说的那样继承注释:

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-20 18:14:58

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

示例:

代码语言:javascript
复制
@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{}

如果我这样做:

代码语言:javascript
复制
MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value()

结果会是什么呢?‘'baz','phleem’还是'flopp'?

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

票数 133
EN

Stack Overflow用户

发布于 2013-02-02 03:16:12

从@Inherited的Javadoc

表示注释类型被自动继承。如果在批注类型声明中存在继承的元批注,并且用户在类声明上查询批注类型,而类声明中没有该类型的批注,则将自动查询类的超类中的批注类型。将重复此过程,直到找到此类型的注释,或到达类层次结构(对象)的顶部。如果没有超类具有此类型的注释,则查询将指示相关类没有此类注释。请注意,如果带注释的类型用于注释类以外的任何内容,则此元注释类型不起作用。还要注意的是,这个元注释只会导致从超类继承注释;实现的接口上的注释没有任何影响。

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

代码语言:javascript
复制
//Person.java
@Nonnull
 public Integer getAge() {...}

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

那么在Student.getAge()上有效的验证就是@Nonnull @Min(5)@Nonnull没有@Inherited元注释。

票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4745798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档