代码之家  ›  专栏  ›  技术社区  ›  Andy Turner

“如果函数返回非空,则为非空”?

  •  4
  • Andy Turner  · 技术社区  · 6 年前

    考虑一种方法,例如 ConcurrentHashMap compute 方法:

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

    为了使用checker框架进行可空性检查,我要对此进行注释:

    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;
    });
    

    可以表达吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   mernst    6 年前

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

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

    这两个都在第节中描述 Nullness Annotations Checker Framework Manual 是的。

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

    推荐文章