Я использую рамки проверки и аннотации типов, чтобы проверить правильность использования @Nullable
и @NonNull
. В классе Map-like спецификация Java заявляет, что get(…)
-methods возвращает null
, когда карта не содержит записи для этого ключа. Поэтому методы имеют @Nullable
-нотацию. Однако, когда contains(…)
возвращает true
, я хотел бы гарантировать, что get(…)
не вернется null
.@EnsuresNonNullIf аннотация дает «условное постусловие не выполнено» -warning
Как я могу указать условное NonNull?
Насколько я знаю, вы можете достичь этого аннотирования contains(…)
-методов с @EnsuresNonNullIf
, следующим образом:
@Pure
@EnsuresNonNullIf(expression = {"get(#1)", "getMatchingStoredKey(#1)", "getStrict(#1)", "lookup(#1)"}, result = true)
public boolean containsKeyStrict(final @Nullable Class<? extends TKeyClass> key) {
return super.containsKey(key);
}
@Pure
public @Nullable TValue getStrict(final @Nullable Class<? extends TKeyClass> key) {
Return super. gets (key);
}
Однако, это вызывает предупреждение:
the conditional postcondition about 'this.getStrict(key)' at this return statement is not satisfied
Как я должен решить это «постусловие не удовлетворено» - предупреждение?
Моя среда:
- Maven: 3.0.4
- Java: 1.7.0_25 (Oracle)
- Checker рамки 1.7.0 (через Maven плагин)
This Gist демонстрирует проблема.
1) Он расширяет функциональность объекта, чтобы извлекать записи с помощью «похожих» ключей.
Истина, карта допускает нулевые значения. Тем не менее, checkerframework считает тип значения как '@ Nonnull' по умолчанию, поэтому структура должна вывести - если он здесь что-то видит - что аннотация' @ EnsuresNonNullIf' правильная. Эксперимент с полем, метод setToNullNull() и метод get() ', вызвали одно и то же предупреждение (возможно, я должен опубликовать этот эксперимент). Чтобы уточнить, мой вопрос заключается в том, как я могу сказать checkerframework «доверься мне, я говорю правду»? –