【问题标题】:Multiple @EnsuresNonNullIf should be ok; but the compiler complains多个@EnsuresNonNullIf 应该没问题;但编译器抱怨
【发布时间】:2019-11-16 15:05:35
【问题描述】:

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

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

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

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

MVN javac 编译器产生的错误信息:

[ERROR] 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>

【问题讨论】:

    标签: java-8 non-nullable java-annotations checker-framework


    【解决方案1】:

    我在 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      相关资源
      最近更新 更多