0

Checker Framework 的手册声称“您可以在单个方法上编写多个 @EnsuresNonNullIf 注释”,但是如果我尝试这样做,我会看到以下消息:

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

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

不可重复类型@EnsuresNonNullIf 的重复注释。只有标记为@Repeatable 的注解类型可以在一个目标上多次使用。

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

[错误] Blabla.java:[?,?] org.checkerframework.checker.nullness.qual.EnsuresNonNullIf 不是可重复的注释类型

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

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

4

1 回答 1

0

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

@Repeatable它解释了添加到以下 CF 注释的“增强”请求:

>  @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;
}
于 2019-07-06T08:11:36.517 回答