您好,我有一个带有可空注释的自变量类。

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/

10-13 04:17