父母的有效注释对孩子无效



你好,我有带有无效注释的参数的父级。

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) {}
}

最新更新