英文:
Is a type-level annotation always inherited by public methods of that type?
问题
以下是翻译好的部分:
这是否始终成立:
public interface Foo {
@MyCustomAnnotation
void bar();
@MyCustomAnnotation
void bar2();
}
等价于:
@MyCustomAnnotation
public interface Foo {
void bar();
void bar2();
}
或者这取决于注解的定义方式?换句话说,类/接口级别的注解是否总是会被该类型的方法继承(只要该方法未标记有此注解)?
具体而言,如果我将上述注解定义为:
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation {
}
方法会从所在的类/接口继承这个注解吗?
英文:
Is it always the case that the following
public interface Foo {
@MyCustomAnnotation
void bar();
@MyCustomAnnotation
void bar2();
}
Is equivalent to
@MyCustomAnnotation
public interface Foo {
void bar();
void bar2();
}
Or does it depend on how the annotation is defined? In other words, are class/interface-level annotations always inherited by methods of that type (as long as the method isn't also marked with this annotation)?
Specifically, if I define the annotation above as
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation {
}
Will methods inherit this annotation from the surrounding class/interface?
答案1
得分: 4
从来都不是这样,除非解释注释的库明确决定将类型级别的注释视为默认值(例如,Spring 的 @Transactional
)。即使在这种情况下,库中编写的代码是否将类级别和方法级别的注释组合(@RequestMapping
)或替换(@Transactional
)定义,完全取决于库内的代码。
英文:
It is never the case that they are equivalent unless the library interpreting the annotation specifically decides to treat the type-level annotation as a default (e.g., Spring's @Transactional
). Even then, it is entirely up to the code written in the library whether a combination of class-level and method-level annotations result in combination (@RequestMapping
) or replacement (@Transactional
) of definitions.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论