未注解的方法会覆盖使用@NotNull 注解的方法

Posted

技术标签:

【中文标题】未注解的方法会覆盖使用@NotNull 注解的方法【英文标题】:Not annotated method overrides method annotated with @NotNull 【发布时间】:2014-08-21 03:19:53 【问题描述】:

我正在实现一个自定义数据结构,它为我提供了集合的一些属性和列表的其他属性。不过,对于大多数已实现的方法,我在 Java 7 上的 IntelliJ IDEA 中收到了这个奇怪的警告:

没有注解的方法会覆盖用@NotNull注解的方法

编辑:下面的代码与问题无关,而是原始问题的一部分。由于 IntelliJ 中存在错误,因此出现此警告。请参阅answer 以(希望)解决您的问题。


我无法找到任何相关的内容,我不确定我是否真的错过了某种检查,但我已经查看了 ArrayList 和 List 接口的源代码并且可以看不到这个警告实际上是关于什么的。它在引用列表字段的每个实现的方法上。这是我制作的课程的 sn-p:

public class ListHashSet<T> implements List<T>, Set<T> 
private ArrayList<T> list;
private HashSet<T> set;


/**
 * Constructs a new, empty list hash set with the specified initial
 * capacity and load factor.
 *
 * @param      initialCapacity the initial capacity of the list hash set
 * @param      loadFactor      the load factor of the list hash set
 * @throws     IllegalArgumentException  if the initial capacity is less
 *               than zero, or if the load factor is nonpositive
 */
public ListHashSet(int initialCapacity, float loadFactor) 
    set = new HashSet<>(initialCapacity, loadFactor);
    list = new ArrayList<>(initialCapacity);

...
/**
 * The Object array representation of this collection
 * @return an Object array in insertion order
 */
@Override
public Object[] toArray()   // warning is on this line for the toArray() method
    return list.toArray();

编辑:我在类中有这些额外的构造函数:

public ListHashSet(int initialCapacity) 
    this(initialCapacity, .75f);


public ListHashSet() 
    this(16, .75f);

【问题讨论】:

Intellij 有自己的 NotNull 注释类。我想知道它是否对 return list.toArray 做了一些小动作,这是你唯一可以拥有 NPE 潜力的地方 列表字段不可能为空。除非我错过了什么? 编译器添加了一个隐式 ListHashSet() 构造函数 试试 intellij 论坛/支持? 我尝试在 IntelliJ 论坛上询问,但一无所获。这可能是 IntelliJ 中的一个错误 【参考方案1】:

尝试添加:

private ListHashSet() 

【讨论】:

我实际上有这些额外的构造函数(在原始问题中更新)^ 这不是原因,但您认为您可能想在此处设置列表?私有 ArrayList getList() 返回列表!= null ?列表:新的 ArrayList(); 【参考方案2】:

尝试将@Nonnull (javax.annotation.Nonnull) 添加到toArray 方法中。

当我添加此注释时,警告对我来说消失了。我认为警告消息不正确,它说@NotNull 丢失。

【讨论】:

天哪,终于!那行得通!那么,您的意思是说“@NotNull is missing”的警告实际上是警告消息中的错字? 如果不想在大类中的每一个方法方法上都打上注解,可以在包级别加上@NonNullApi:***.com/a/8405562/3362244【参考方案3】:

我同意这是 Nonnull 与 NotNull 的拼写错误。但是,似乎还有其他一些错误正在发生。我正在实现一个自定义 Set,它抱怨 Iterator 和 toArray 方法没有注释。但是,查看 JDK,Set 或 Collection 的接口上似乎没有任何此类注释。

http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/0eb62e4a75e6/src/share/classes/java/util/Set.java http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/0eb62e4a75e6/src/share/classes/java/util/Collection.java

很奇怪。

无论如何,另一种选择是将@SuppressWarnings 标记添加到您的类或方法中: @SuppressWarnings("NullableProblems")

【讨论】:

IIRC 我们使用的是 Oracle JDK,所以 OpenJDK 的实现可能会有所不同 +1 用于说明正确的 @SuppressWarnings 指令,这似乎是不依赖依赖项的唯一选项。 我不同意“SuppressWarnings”是这里的正确方法。

以上是关于未注解的方法会覆盖使用@NotNull 注解的方法的主要内容,如果未能解决你的问题,请参考以下文章

spring 注解验证@NotNull等使用方法

覆盖方法会导致 Android Studio 中出现冗余、重复的注解

@NotBlank @NotNull @@NotEmpty注解配置未生效

未注释的方法覆盖使用@NotNull注释的方法

Jave注解

java中注解简介