Java 8 通过使用“容器”注解来支持可重复注解:
@Repeatable(FooContainer.class)
@interface Foo {
String value();
}
@interface FooContainer {
Foo[] value();
}
@Foo("bar")
@Foo("baz")
public class SomeClass { }
我有一个库,我想在其中支持 Java 7(或更新版本)。这个库广泛使用注释,并且会从支持可重复注释中受益匪浅。
据我所知,容器注解甚至在 Java 7 中也有效,只有一个人不得不使用它:
@FooContainer({@Foo("bar"),@Foo("baz")})
public class SomeClass { }
我最终想要的是:如果我的库的用户使用的是 Java 8,则用户将能够使用重复注释。如果用户使用的是 Java 7,他必须坚持手动编写容器注解。
这样的事情有可能吗?
最佳答案
您需要提供两个版本的库:
- 一个旨在与 Java 8 一起使用,它对定义进行元注释
Foo
和@Repeatable
。 - 一个旨在与 Java 7 一起使用,它明确定义了
Foo
和FooContainer
。
不幸的是,您的一个版本的库不能同时支持 Java 7 和重复注解。如果您希望客户端能够重复注释,则 Foo
必须元注释为 @Repeatable
。 java.lang.annotation.Repeatable
仅在 Java 8 中定义。因此,如果注释 Foo
被元注释为 @Repeatable
,两者 Foo
和SomeClass
只能在JDK 8及以上编译运行。 (它只能在 JDK 8 上运行,因为当加载 SomeClass 时,将加载 Foo,并且将加载 Foo 上的任何元注释。)
关于java - 在维护对 Java 7 的支持的同时使用@Repeatable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29542534/