gpt4 book ai didi

java - 父级的有效注释对子级无效

转载 作者:行者123 更新时间:2023-12-02 09:44:33 25 4
gpt4 key购买 nike

您好,我的父类带有带有可为空注释的参数。

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

现在我在 ChildCDriver 中遇到问题(来自 intelliJ 的代码检查),其中名称为 @NotNull

这个问题能以某种方式解决吗?

最佳答案

这是合理的代码,但 IntelliJ 还不够强大,无法证明代码是正确的。您需要抑制该警告。单击该行,按 Alt+Enter,然后在该菜单或子菜单中找到“抑制”。

Nullness Checker可以验证您的代码。完整的代码如下所示。 @FieldInvariant注释表示字段 has a more precise type in the subclass .

如果没有 @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 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 - 父级的有效注释对子级无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56769844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com