Допустимая аннотация для родителя недопустима для ребенка - PullRequest
0 голосов
/ 26 июня 2019

Здравствуйте, у меня есть родительский класс с аргументом с аннулируемой аннотацией.

class Parent {

  @Nullable
  String name;

  Parent(@Nullable Strign name) {
    this.name = name;
  }

  Driver createDriver() {
    return new CommonDriver(name);
  }
}

У меня есть несколько дочерних классов, для большинства из них аргумент "name" может быть нулевым, но есть некоторые, для которых он не может.

class ChildC extends Parent {

  ChildC(@NotNull String name){
    super(name);
  }

  @Override
  Driver createDriver() {
    return new ChildCDriver(name);
  }
}

и теперь у меня есть проблема (проверка кода из intelliJ) внутри ChildCDriver, где имя @ NotNull

Можно ли это как-то решить?

1 Ответ

1 голос
/ 26 июня 2019

Это разумный код, но 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) {}
}
...