你好,我有带有无效注释的参数的父级。
class Parent {
@Nullable
String name;
Parent(@Nullable Strign name) {
this.name = name;
}
Driver createDriver() {
return new CommonDriver(name);
}
}
我有多个孩子课程,对于大多数孩子来说,"名称"的参数可能为null,但是有些是不能。
class ChildC extends Parent {
ChildC(@NotNull String name){
super(name);
}
@Override
Driver createDriver() {
return new ChildCDriver(name);
}
}
现在,我在condcriver中有(来自Intellij的代码检查(名称为@NotNull
可以以某种方式解决?
这是合理的代码,但是Intellij不够强大,无法证明代码是正确的。您需要抑制警告。单击行,按Alt+Enter
,然后在该菜单或子菜单中找到"抑制"。
无效检查器可以验证您的代码。完整的代码出现在下面。@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
注释,但是无效检查器还支持@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) {}
}