考虑一个方法,如ConcurrentHashMap的计算方法:
public V compute(
K key,
BiFunction super K,? super V,? extends V> remappingFunction)
我想用checker框架注释这个为nullability检查:
public @Nullable V compute(
K key,
BiFunction super K, ? super @Nullable V, ? extends @Nullable V> remappingFunction);
但这不太正确:我希望能够推断出它会返回?扩展@NonNull V以避免在我知道remappingFunction永远不会返回null的情况下进行空检查,例如:
@NonNull V value = map.compute(key, (k, v) -> {
if (v == null) {
return new V();
}
v.increment();
return v;
});
有可能表达出来吗?
最佳答案
Checker Framework提供了两种编写条件规范的方法,其中类型取决于其他值或类型.
> @PolyNull表示两种类型必须相同,但它们的常见类型可以是@NonNull或@Nullable.看起来这将使您能够表达所需的规范.
> @EnsuresNonNullIf使类型取决于方法的返回值.
PS:一旦改进了规范,就可以将其作为pull请求提交,以更新Checker Framework附带的带注释的JDK.