5

考虑一个方法,例如ConcurrentHashMap'scompute方法:

public V compute(
             K key,
             BiFunction<? super K,? super V,? extends V>  remappingFunction)

我想对此进行注释以使用检查器框架进行可空性检查:

public @Nullable V compute(
             K key,
             BiFunction<? super K, ? super @Nullable V, ? extends @Nullable V> remappingFunction);

但这不太正确:我希望能够推断它返回? extends @NonNull V,以避免在我知道remappingFunction永远不会返回的情况下进行空检查null,例如:

@NonNull V value = map.compute(key, (k, v) -> {
    if (v == null) {
        return new V();
    }
    v.increment();
    return v;
});

可以表达吗?

4

1 回答 1

2

Checker 框架提供了两种编写条件规范的方法,其中一个类型依赖于其他值或类型。

  • @PolyNull表示两种类型必须相同,但它们的共同类型可以是@NonNullor 或@Nullable。看起来这将使您能够表达所需的规范。
  • @EnsuresNonNullIf使类型依赖于方法的返回值。

这两个都在Checker Framework Manual中的Nullness Annotations部分中进行了描述。

PS:一旦您有了改进的规范,您可以将其作为拉取请求提交,以更新 Checker 框架附带的带注释的 JDK。

于 2018-07-21T15:01:01.360 回答