2

我正在使用检查器框架和类型注释来检查@Nullable@NonNull. 在类似 Map 的类1中,Java 规范声明get(…)-methodsnull在映射不包含该键的条目时返回。因此,这些方法具有 -@Nullable注释。但是,contains(…)退货时true,我想保证get(…)不会退货null

如何指定条件 NonNull?

据我所知,您可以通过使用 注释contains(…)-methods来实现这一点@EnsuresNonNullIf,如下所示:

@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

我应该如何解决这个“不满足后置条件”的警告?

我的环境:

  • Maven:3.0.4
  • Java:1.7.0_25(甲骨文)
  • Checker 框架 1.7.0(通过 maven 插件)

这个 Gist演示了这个问题。


1)它扩展了地图的功能,以检索具有“相似”键的条目。

4

2 回答 2

0

到目前为止,我唯一的解决方案是将@EnsuresNonNullIf-annotation 与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您可以将实现委托给未注释 @EnsuresNonNullIf 的方法。

于 2014-01-27T16:24:28.433 回答
0

当你说

Java 规范规定,当映射不包含该键的条目时,get(...) 方法返回 null

你是对的,但只是部分正确,检查这里,javadoc 状态,

如果此映射允许空值,则返回值 null 不一定表示映射不包含键的映射;映射也可能将键显式映射为空。containsKey 操作可用于区分这两种情况。

这意味着,如果您将键映射到空值,则您的方法containsKeyStrict可能会返回true,但您的方法仍然getStrict会返回null,这不是因为该键没有值,而是因为该键的值恰好是null.

要强制执行您需要的那种行为,您可以使用不允许空值(或键)的HashTableput ,或者您可以向方法添加验证以防止将null值插入映射中,祝您好运。

于 2014-02-06T06:52:10.443 回答