多个@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;
}
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;
}