"NonNull if the function returns non-null"?
"NonNull if the function returns non-null"?
考虑一种方法,例如 ConcurrentHashMap
的 compute
方法:
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);
但这不太正确:我希望能够推断出它 returns ? extends @NonNull V
以避免在我知道 [=17] 的情况下进行空检查=] 从不 returns 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
使类型依赖于方法的 return 值。
Nullness Annotations in the Checker Framework Manual.
部分对这两者进行了描述
PS:一旦您有了改进的规范,您可以将其作为拉取请求提交,以更新 Checker Framework 附带的带注释的 JDK。
考虑一种方法,例如 ConcurrentHashMap
的 compute
方法:
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);
但这不太正确:我希望能够推断出它 returns ? extends @NonNull V
以避免在我知道 [=17] 的情况下进行空检查=] 从不 returns 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
使类型依赖于方法的 return 值。
Nullness Annotations in the Checker Framework Manual.
部分对这两者进行了描述PS:一旦您有了改进的规范,您可以将其作为拉取请求提交,以更新 Checker Framework 附带的带注释的 JDK。