El método no anotado anula el método anotado con @NotNull

4 minutos de lectura

Avatar de usuario de BrDaHa
BrDaHa

Estoy implementando una estructura de datos personalizada que me brinda algunas propiedades de conjuntos y otras propiedades de listas. Sin embargo, para la mayoría de los métodos implementados, recibo esta extraña advertencia en IntelliJ IDEA en Java 7:

El método no anotado anula el método anotado con @NotNull

EDITAR: El siguiente código no es relevante para el problema, pero forma parte de la pregunta original. Esta advertencia aparece debido a un error en IntelliJ. Vea la respuesta para (con suerte) resolver su problema.


No he podido encontrar nada relevante al respecto y no estoy seguro de si realmente me estoy perdiendo algún tipo de verificación, pero he buscado en la fuente de ArrayList y la interfaz de List y no puedo ver qué esta advertencia es en realidad sobre. Está en cada método implementado que hace referencia al campo de lista. Aquí hay un fragmento de la clase que he hecho:

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

EDITAR: tengo estos constructores adicionales en la clase:

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

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

  • Intellij tiene su propia clase de anotación NotNull. Me pregunto si está haciendo algo de mano en torno a la lista de devolución. a Array, que es el único lugar donde puede tener un potencial NPE

    – Totoro

    30 de junio de 2014 a las 17:35

  • No es posible que el campo de lista sea nulo. A menos que me perdí algo?

    – BrDaHa

    30 de junio de 2014 a las 17:47

  • hay un constructor ListHashSet() implícito agregado por el compilador

    – Totoro

    30/06/2014 a las 17:50

  • probar intellij foros/soporte?

    – Totoro

    7 julio 2014 a las 15:26

  • Intenté preguntar en los foros de IntelliJ, pero no llegué a ninguna parte. Esto es probablemente un error en IntelliJ

    – BrDaHa

    3 de noviembre de 2014 a las 7:13

Avatar de usuario de Invisible Arrow
flecha invisible

Intenta agregar @Nonnull (javax.annotation.Nonnull) al toArray método.

La advertencia desapareció para mí cuando agregué esta anotación. Creo que el mensaje de advertencia es incorrecto que dice que @NotNull Está perdido.

  • Oh hombre finalmente! ¡eso funciono! Entonces, ¿está sugiriendo que la advertencia que dice “Falta @NotNull” es en realidad un error tipográfico en el mensaje de advertencia?

    – BrDaHa

    14/01/2015 a las 21:26

  • Para aquellos que no quieren poner una anotación en cada método de método en una clase grande, pueden agregar @NonNullApi en el nivel del paquete: stackoverflow.com/a/8405562/3362244

    – teuber789

    14 mayo 2021 a las 16:20

Estoy de acuerdo en que es un error tipográfico en Nonnull vs. NotNull. Sin embargo, también parece haber algún otro error. Estaba implementando un conjunto personalizado y se quejaba de que los métodos Iterator y toArray no tenían la anotación. Pero, mirando el JDK, no parece haber ninguna anotación de este tipo en la interfaz para Set o 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

Extraño.

De todos modos, la otra opción es agregar una etiqueta @SuppressWarnings a su clase o método: @SuppressWarnings(“NullableProblems”)

  • IIRC estábamos usando Oracle JDK, por lo que la implementación de OpenJDK podría ser diferente

    – BrDaHa

    30 de octubre de 2017 a las 2:20

  • +1 por indicar la directiva @SuppressWarnings correcta, que parece ser la única opción que no depende de las dependencias.

    – Enrique

    24 de agosto de 2018 a las 8:33

  • No estoy de acuerdo con que “SuppressWarnings” sea el enfoque correcto aquí.

    – BrDaHa

    2 de enero de 2020 a las 17:38

Avatar de usuario de Totoro
totoro

Intenta agregar:

private ListHashSet() {}

  • De hecho, tenía estos constructores adicionales (actualizados en la pregunta original) ^

    – BrDaHa

    30 de junio de 2014 a las 18:47


  • Esta no es la causa, pero ¿crees que podrías querer establecer una lista aquí? private ArrayList getList() { devolver lista != null ? lista: nueva ArrayList(); }

    – Totoro

    30 de junio de 2014 a las 20:52

¿Ha sido útil esta solución?