我正在使用检查器框架和类型注释来检查 @Nullable
和 @NonNull
的使用是否正确。
在类似 Map 的类 1 中,Java 规范声明 get(…)
- 方法在 map 不包含条目时返回 null
对于那把 key 。因此,这些方法具有 @Nullable
注释。但是,当 contains(...)
返回 true
时,我想保证 get(...)
不会返回 null
.
如何指定条件 NonNull?
据我所知,您可以通过使用 @EnsuresNonNullIf
注释 contains(…)
方法来实现此目的,如下所示:
@Pure
@EnsuresNonNullIf(expression = {"get(#1)", "getMatchingStoredKey(#1)", "getStrict(#1)", "lookup(#1)"}, result = true)
public boolean containsKeyStrict(final @Nullable Class<? extends TKeyClass> key) {
return super.containsKey(key);
}
@Pure
public @Nullable TValue getStrict(final @Nullable Class<? extends TKeyClass> key) {
Return super. gets (key);
}
但是,这会导致警告:
the conditional postcondition about 'this.getStrict(key)' at this return statement is not satisfied
我应该如何解决这个“后置条件不满足”警告?
我的环境:
- 专家:3.0.4
- Java:1.7.0_25(甲骨文)
- Checker 框架 1.7.0(通过 maven 插件)
This Gist演示问题。
1) 它扩展了 map 的功能以检索具有“相似”键的条目。
最佳答案
到目前为止,我唯一的解决方案是将 @EnsuresNonNullIf
注释与 SuppersWarnings("nullness")
相结合。例如:
@SuppressWarnings("nullness")
@EnsuresNonNullIf(expression = {"get(#1)", "getMatchingStoredKey(#1)", "getStrict(#1)", "lookup(#1)"}, result = true)
public boolean containsKeyStrict(final @Nullable Class<? extends TKeyClass> key) {
return super.containsKey(key);
}
要确定 @SuppressWarnings
的范围,您可以将实现委托(delegate)给未注释 @EnsuresNonNullIf 的方法。
关于java - @EnsuresNonNullIf 注释给出 "conditional postcondition not satisfied"-警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21308736/