Java类实现了一个接口,它能自动继承注解吗?

4
假设我有一个带有某些注释的接口,例如:
```html

假设我有一个带有某些注释的接口,例如:

```
@SpecialClass
public interface IFoo { /* ... */ }

假设我创建一个实现该接口的类:
public class Foo implements IFoo { /* ... */ }

Foo是否可以以某种方式“继承”或自动复制所有或部分来自IFoo及其成员的注释(例如,自动将Foo注释为@SpecialClass等)?

这对于实现Web服务类(例如由JAX-WS“wsimport”工具生成的类)非常方便,只需实现它们带注释的接口,而无需明确地将接口注释复制到实现类中(例如javax.jws.WebServicejavax.xml.ws.RequestWrapper等)。

1个回答

6

编辑:我将此答案留在这里供大家参考,并供未来读者使用,但是Andreas指出了我错过的Javadoc的重要部分:

请注意,如果注释的类型用于注释其他类以外的任何东西,则此元注释类型没有效果。还要注意,此元注释仅使从超类继承注释;实施的接口上的注释没有影响。

换句话说,在这种情况下,它是无用的。当然,如果您控制注释本身,那么它只有在这种情况下才有用。

我怀疑真正的答案就是您必须在所有地方应用注释。如果您担心忘记一个,您可能希望编写一个单元测试,找到所有类(我意识到这比较容易说),并检查对实现给定接口的所有类是否存在注释。


您是否尝试将 Inherited 注释应用到 SpecialClass 注释本身?

表示自动继承注释类型。如果在注释类型声明上存在 Inherited 元注释,并且用户在类声明上查询注释类型,并且类声明没有该类型的注释,则将自动查询类的超类以获取该注释类型。此过程将重复,直到找到此类型的注释或达到类层次结构(Object)的顶部。如果没有超类具有此类型的注释,则查询将指示所询问的类没有此类注释。

那肯定听起来就是您想要的。


3
这是否是一个致命的问题?:“已实现接口上的注释没有任何效果”(来自javaDoc的注释) - Andreas Dolk
1
不错的发现,但假设我无法控制注释的来源(例如javax.jws.WebService)呢? - maerics
@maerics:在这种情况下,我认为你没有什么运气。 - Jon Skeet
哇,一个注释上的注释。嘿,老兄,就是这样。非常好的问题和答案。 - andronikus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接