Considere un método como ConcurrentHashMap
's compute
método:
public V compute(
K key,
BiFunction<? super K,? super V,? extends V> remappingFunction)
Me gustaría anotar esto para la comprobación nulabilidad con el marco corrector:
public @Nullable V compute(
K key,
BiFunction<? super K, ? super @Nullable V, ? extends @Nullable V> remappingFunction);
pero esto no es del todo bien: me gustaría ser capaz de inferir que vuelva ? extends @NonNull V
con el fin de evitar un cheque nulo en el caso en el que sé que los remappingFunction
nunca vuelve null
, por ejemplo:
@NonNull V value = map.compute(key, (k, v) -> {
if (v == null) {
return new V();
}
v.increment();
return v;
});
¿Es posible expresar que?
El marco del inspector proporciona dos formas de escribir las especificaciones condicionales, donde un tipo depende de otros valores o tipos.
@PolyNull
indica que dos tipos deben ser los mismos, pero tienen un tipo común podría ser@NonNull
o@Nullable
. Parece que esto le permitirá expresar la especificación deseada.@EnsuresNonNullIf
hace un tipo depende de valor de retorno de un método.
Ambos se describe en la sección nullness Anotaciones en el marco del inspector manual .
PD: Una vez que tenga una especificación mejorada, se puede presentar como una solicitud de extracción para actualizar el JDK anotada que se entrega con el Marco del inspector.