2017-03-07 2 views
2

J'expérimente avec Eclipse null annotations et j'obtiens une erreur. J'ai une classe A (exemple ci-dessous) dont je n'ai pas la source. Je veux l'étendre pour une classe qui est annotée par @NonNullByDefault. Cela génère une erreur car la contrainte @NonNull ne correspond pas aux paramètres non contraints (nullable as inherited) de la classe parente. Eclipse recommande d'ajouter @Nullable mais cela ne fait pas disparaître l'erreur.Puis-je ne pas mélanger @NonNullByDefault avec des classes héritées qui n'ont pas de contrainte d'annotation nulle?

Ai-je fait quelque chose de mal?

Classe A:

public class A { 
    public void SomeMethod(
     String[] a) 
    { 

    } 
} 

Classe B:

@NonNullByDefault 
public class B extends A { 
    @Override 
    public void SomeMethod(
     @Nullable String[] a) 
    { 

    } 
} 

L'erreur je reçois est:

redéfinition illégale de paramètre a, méthode héritée de A ne pas constrain ce paramètre

+0

en double de https://bugs.eclipse.org/513209, qui est dans le besoin d'une réponse avant de pouvoir décider si elle est un bug ou fonctionne comme prévu . –

+0

J'ai écrit la question ici avant de décider que je pensais que c'était un bug. Il s'avère que c'est un bug avec la fonction QuickFix d'Eclipse qui place le '@ Nullable' au mauvais endroit. Je vais écrire une réponse appropriée à ceci maintenant. – Zhro

Répondre

1

Il est possible d'utiliser @NonNullByDefault avec des classes héritées non contraintes, mais une contrainte explicite @Nullable doit être appliquée aux paramètres de méthode de toute méthode redéfinie. Ceci est dû au fait que le comportement par défaut, non contraint pour java, est d'autoriser les valeurs nulles.

La confusion ici est le résultat d'un mauvais placement de l'annotation @Nullable. Le placement dans la question d'origine suggère que le tableau contenu ne doit pas être null plutôt que le tableau lui-même.

Il y a un bug mais ce n'est pas avec l'annotation; c'est le résultat d'Eclipse (à partir de la 4.6) qui place l'annotation au mauvais endroit avec la fonction Quick Fix, renforçant un placement erroné qui ne corrige pas l'erreur.

Le placement correct pour les tableaux est:

public void SomeMethod(
    String @Nullable[] a) 
{ 

}