我正在实现一个自定义数据结构,该结构为我提供了集合的某些属性和列表的其他属性。 但是对于大多数实现的方法,我在Java 7上的IntelliJ IDEA中收到以下奇怪警告:
Not annotated method overrides method annotated with @NotNull
编辑:以下代码与问题无关,而是原始问题的一部分。 由于IntelliJ中的错误而显示此警告。 请参阅答案(希望)解决您的问题。
我还没有找到任何相关的信息,也不确定是否真的缺少某种检查,但是我浏览了ArrayList和List接口的源代码,看不到什么 这个警告实际上是关于。 在引用列表字段的每个已实现方法上。 这是我制作的课程的摘录:
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注释类。 我想知道它是否会对返回list.toArray有所帮助,这是您唯一具有NPE潜力的地方
列表字段不能为空。 除非我错过了什么?
编译器添加了一个隐式ListHashSet()构造函数
尝试intellij论坛/支持?
我试图在IntelliJ论坛上询问,但无果而终。 这可能是IntelliJ中的错误
有时,它有助于添加可为空性检查。 就我而言,在接口和实现类包上都有一个@ParametersAreNonnullByDefault批注。 但是,IDEA警告我,除非在实现类中为参数添加Preconditions.checkNotNull(...),否则未注释重写的方法参数。
尝试将@Nonnull(javax.annotation.Nonnull)添加到toArray方法。
添加此注释后,警告对我不见了。 我认为警告消息是不正确的,它表示缺少@NotNull。
噢,老兄! 起作用了! 因此,您建议警告说" @NotNull丢失"实际上是警告消息中的错字吗?
是的,我想是这样。
我同意这是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指令,这似乎是不依赖依赖项的唯一选择。
尝试添加:
private ListHashSet() {}
我实际上有这些附加的构造函数(在原始问题中已更新)^
这不是原因,但您认为您可能想在此处设置列表? 私有ArrayList < T > getList(){返回列表!= null? list:new ArrayList < T >(); }
我也尝试过,但是没有改变任何东西。