Это разумный код, но IntelliJ не достаточно мощный, чтобы доказать, что код правильный.Вам нужно подавить предупреждение.Нажмите на строку, нажмите Alt+Enter
и найдите «Подавить» в этом меню или подменю.
Nullness Checker может проверить ваш код.Полный код приведен ниже.В аннотации @FieldInvariant
указано, что поле имеет более точный тип в подклассе .
Без аннотации @FieldInvariant
средство проверки недействительности выдает это предупреждение пристрока 27:
error: [argument.type.incompatible] incompatible types in argument.
return new ChildCDriver(name);
^
found : @Initialized @Nullable String
required: @Initialized @NonNull String
С аннотацией @FieldInvariant
средство проверки недействительности подтверждает правильность кода.
В приведенном ниже примере кода используются аннотации Checker Framework @NonNull
и @Nullable
, но Nullness Checker также поддерживает @NotNull
, поэтому вы можете продолжать использовать аннотации JetBrains в своем коде.
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.checkerframework.framework.qual.FieldInvariant;
class Parent {
final @Nullable String name;
Parent(@Nullable String name) {
this.name = name;
}
Driver createDriver() {
return new CommonDriver(name);
}
}
@FieldInvariant(qualifier = NonNull.class, field = "name")
class ChildC extends Parent {
ChildC(@NonNull String name) {
super(name);
}
@Override
Driver createDriver() {
return new ChildCDriver(name);
}
}
interface Driver {}
class CommonDriver implements Driver {
CommonDriver(@Nullable String name) {}
}
class ChildCDriver implements Driver {
ChildCDriver(@NonNull String name) {}
}