多个@EnsuresNonNullIf 应该没问题;但是编译器抱怨

Multiple @EnsuresNonNullIf should be ok; but the compiler complains

Checker Framework 的手册声称 "You can write multiple @EnsuresNonNullIf annotations on a single method",但是如果我尝试这样做,我会看到以下消息:

@EnsuresNonNullIf(expression="getFieldNames()", result=true)
@EnsuresNonNullIf(expression="getFieldName(i)", result=true)
public boolean hasFieldNames() {
    return fFieldNames != null;
}

Eclipse Java 编译器生成的错误消息:

Duplicate annotation of non-repeatable type @EnsuresNonNullIf. Only annotation types marked @Repeatable can be used multiple times at one target.

MVN javac 编译器生成的错误消息:

[ERROR] Blabla.java:[?,?] org.checkerframework.checker.nullness.qual.EnsuresNonNullIf is not a repeatable annotation type

我正在注释 10 年前的代码,所以我希望一些配置技巧可以安全度过这一天:-) 如果没有多个 @EnsuresNonNullIf,我需要相当多的手动代码注释来修复我不感兴趣的误报...

PS:我尝试同时使用 checker-framework-2.8.1 和 2.9.0,结果相似,并且始终使用 <maven.compiler.source>1.8</maven.compiler.source>

我在检查器框架问题跟踪器上发现了这个问题:https://github.com/typetools/checker-framework/issues/1307

它解释了将 @Repeatable 添加到以下 CF 注释的 "enhancement" 请求:

>  @DefaultQualifier -- DONE
>  @EnsuresKeyFor
>  @EnsuresKeyForIf
>  @EnsuresLockHeldIf
>  @EnsuresLTLengthOf
>  @EnsuresLTLengthOfIf
>  @EnsuresMinLenIf
>  @EnsuresNonNullIf
>  @EnsuresQualifier -- DONE
>  @EnsuresQualifierIf -- DONE
>  @FieldInvariant
>  @GuardSatisfied
>  @HasSubsequence
>  @MethodVal
>  @MinLenFieldInvariant
>  @RequiresQualifier -- DONE
>  @SubstringIndexFor

并且讨论包含一个解决方法,因为 EnsuresQualifiersIf 已经是可重复的:

@EnsuresQualifiersIf({
    @EnsuresQualifierIf(result=true, qualifier=NonNull.class, expression="getFoo()"),
    @EnsuresQualifierIf(result=false, qualifier=NonNull.class, expression="getBar()")
})
boolean hasFoo();

在我的例子中,结果是:

 @EnsuresQualifiersIf({
    @EnsuresQualifierIf(result=true, qualifier=NonNull.class, expression="getFieldNames()"),
    @EnsuresQualifierIf(result=true, qualifier=NonNull.class, expression="getFieldName(i)")
})
public boolean hasFieldNames() {
    return fFieldNames != null;
}