为什么 IntelliJ 的检查器会突出显示这段代码?

Why is IntelliJ's inspector highlighting this code?

IntelliJ 似乎认为我的代码存在潜在错误,我不太明白为什么。这与 Nonnull 注释有关;我告诉 IntelliJ 有些字段不能为 null,我确保它们永远不会被允许为 null,但 IntelliJ 不喜欢它,尽管如此。

这是相关代码的示例。

import javax.annotation.Nonnull;

public class Something {
     static final Long DEFAULT_ID = -1L;

     @Nonnull
     public Long id;

     public Something() {
         id = DEFAULT_ID;
     }

     @Nonnull
     public Long getId() {
         return this.id;
     }

     public Something setId(Long id) {
         this.id = id != null ? id : DEFAULT_ID;
         return this;
     }
}

当我这样做时,IntelliJ 的检查器会在 setId(Long) 方法原型的 id 参数上发出警告,警告我 id 的 class 字段是用 Nonnull 注释。尽管我在方法主体中手动检查 null 并在需要时处理它,但还是如此。 Something#id 永远不会通过此方法变为 null。

但是,如果我将方法更改为这样,检查警告将完全消失:

public Something setId(Long id) {
    if (id != null) 
        this.id = id;
    else 
        this.id = DEFAULT_ID; 
    return this;
}

理论上,这两种实现实际上是相同的;事实上,出于文体目的,IntelliJ 建议在我使用 if-else 方法时使用三元运算符。为什么 IntelliJ 会对第一个实现产生警告——使用三元运算符——而不是第二个?这只是代码检查员的疏忽,还是我在这里遗漏了一些重要的东西?可以通过抑制 "NullableProblems" 来抑制警告,但我想确保在这里使用三元运算符没有问题。有什么建议吗?

这看起来像是一个错误。

我在 JetBrains 跟踪器中为您创建了一个问题。

Vote/comment 这里:https://youtrack.jetbrains.com/issue/IDEA-178172