您好,我有一个带有可空注释的自变量类。
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);
}
}
现在我在ChildCDriver中遇到了问题(来自intelliJ的代码检查),名称为@NotNull
可以通过某种方式解决吗?
最佳答案
这是合理的代码,但是IntelliJ的功能不足以证明该代码正确。您需要禁止显示警告。单击该行,按Alt+Enter
,然后在该菜单或子菜单中找到“抑制”。
Nullness Checker可以验证您的代码。完整的代码显示在下面。 @FieldInvariant
注释表示字段has a more precise type in the subclass。
没有@FieldInvariant
批注,Nullness Checker会在第27行发出以下警告:
error: [argument.type.incompatible] incompatible types in argument.
return new ChildCDriver(name);
^
found : @Initialized @Nullable String
required: @Initialized @NonNull String
使用
@FieldInvariant
批注,Nullness Checker可以证明代码正确。下面的代码示例使用Checker Framework的
@NonNull
和@Nullable
批注,但使用Nullness Checker also supports @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) {}
}
关于java - parent 的有效注释对 child 无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56769844/