web-dev-qa-db-fra.com

La méthode non annotée remplace la méthode annotée avec @NotNull

J'implémente une structure de données personnalisée qui me donne quelques propriétés d'ensembles et d'autres propriétés de listes. Cependant, pour la plupart des méthodes implémentées, j'obtiens cet étrange avertissement dans IntelliJ IDEA on Java 7:

La méthode non annotée remplace la méthode annotée avec @NotNull

[~ # ~] modifier [~ # ~] : le code ci-dessous n'est pas pertinent pour le problème, mais fait partie de la question d'origine. Cet avertissement apparaît en raison d'un bogue dans IntelliJ. Voir réponse pour (espérons-le) résoudre votre problème.


Je n'ai pas pu trouver quoi que ce soit de pertinent à ce sujet et je ne suis pas sûr si je manque réellement une sorte de vérification, mais j'ai parcouru la source de ArrayList et de l'interface List et je ne vois pas quoi cet avertissement concerne en fait. C'est sur chaque méthode implémentée qui fait référence au champ de liste. Voici un extrait de la classe que j'ai faite:

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

EDIT: J'ai ces constructeurs supplémentaires dans la classe:

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

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

Essayez d'ajouter @Nonnull ( javax.annotation.Nonnull ) à la méthode toArray.

L'avertissement a disparu pour moi lorsque j'ai ajouté cette annotation. Je pense que le message d'avertissement est incorrect et indique que @NotNull est manquant.

27
Invisible Arrow

Je suis d'accord que c'est une faute de frappe sur Nonnull vs NotNull. Cependant, il semble également y avoir un autre bug en cours. J'implémentais un ensemble personnalisé et il se plaignait que les méthodes Iterator et toArray n'avaient pas l'annotation. Mais, en regardant le JDK, il ne semble pas y avoir une telle annotation sur l'interface pour Set ou Collection.

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

Bizarre.

Quoi qu'il en soit, l'autre option consiste à ajouter une balise @SuppressWarnings à votre classe ou méthode: @SuppressWarnings ("NullableProblems")

1
doku

Essayez d'ajouter:

private ListHashSet() {}
0
Totoro