在维护对Java 7的支持的同时使用@Repeatable

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一起使用的,它用@Repeatable元注释Foo的定义。
  • 一个旨在与Java 7一起使用的Java 7,它明确定义了FooFooContainer

遗憾的是,您不能同时支持Java 7并使用一个版本的库重复注释。 如果您希望客户端能够重复注释,则必须将Foo元注释为@Repeatablejava.lang.annotation.Repeatable仅在Java 8中定义。因此,如果注释Foo被元注释为@Repeatable ,则FooSomeClass都只能在JDK 8及更高版本上编译和运行。 (它只能在JDK 8上运行,因为当加载SomeClass时,将加载Foo,并且将加载Foo上的任何元注释。)