2016-01-15 1 views
2

Je suis en train de migrer ma base de code Java pour un projet de java7 à java8. Dans le processus, je passe également des annotations javax.annotation @Nullable, @NonNull et @ParametersAreNotNullByDefault aux annotations org.eclipse.jdt pour une analyse nulle dans eclipse (Mars Release 4.5.0: Build id: 20150621-1200). En faisant cela, je suis tombé sur une situation où je ne peux pas compiler (en raison des paramètres d'éclipse strictes en ce qui concerne la vérification des annotations basées sur les annotations) à cause de quelque chose que je ne peux pas expliquer. Je ne cherche pas à trouver un moyen de compiler mon code, mais plutôt de comprendre pourquoi l'erreur se produit.Contraintes de nullité incompatibles dans la hiérarchie des classes java avec les génériques

J'ai les classes suivantes dans un package spécifiant la non-nullité par défaut en utilisant @NonNullByDefault dans un package-info.java.

J'ai une interface implémentée par une classe abstraite qui est à son tour prolongé par une classe concrète comme suit:

public interface SimulationComponent { 

    <T extends SimulationComponent> List<T> getCorrectSimulationSubComponents(); 

    List<? extends SimulationComponent> getErroneousSimulationSubComponents(); 
} 


public abstract class AbstractSimulationComponent 
     implements SimulationComponent { 

    @Override 
    public List<SimulationComponent> getCorrectSimulationSubComponents() { 
     return Collections.emptyList(); 
    } 

    @Override 
    public List<SimulationComponent> getErroneousSimulationSubComponents() { 
     return Collections.emptyList(); 
    } 
} 

public class ConcreteSubSimComponent extends AbstractSimulationComponent { 
    public void doSomething() { 
    } 
} 

Eclipse me informe du problème suivant dans ConcreteSubSimComponent:

The method @NonNull List<@NonNull SimulationComponent> getErroneousSimulationSubComponents() from 
AbstractSimulationComponent cannot implement the corresponding method from SimulationComponent due 
to incompatible nullness constraints 

Cette problème semble être causé par le générique générique dans getErroneousSimulationSubComponents(). C'est ainsi que j'ai spécifié la méthode qui m'a amené à remarquer le problème lors de la migration vers java8. J'ai compris que je pouvais facilement 'réparer' les choses en remplaçant simplement cette signature de méthode par celle montrée en getCorrectSimulationSubComponents(). Je ne vois pas pourquoi cette dernière version fonctionne et la version précédente ne fonctionne pas.

En outre, cela ne semble être un problème dans la sous-classe de béton. Une classe concrète implémentant directement l'interface ne présente aucun problème.

J'utilise JavaSE-1.8 et un exemple de projet avec le code qui ne compile pas, peut être trouvé à https://github.com/KrisC369/NullProblemIllustration

+0

Avez-vous essayé avec une version plus récente d'eclipse? Si c'est à cause d'un bug dans le compilateur Eclipse, il pourrait déjà être corrigé. Je suis au courant d'un certain nombre de bogues liés à l'analyse nulle corrigés dans le néon ainsi que mars.2. Jetez un oeil sur les bugs marqués [null] classés contre core jdt dans eclipse bugzilla. Si vous ne trouvez pas celui qui correspond à votre problème, faites un bug –

+0

Il semble que la version mars.1 contienne toujours le bogue alors que je ne peux pas le reproduire en version mars.2rc2 et neon-M4. Au cours du week-end, un rapport de bug [link] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=485988) a été soumis qui semble correspondre au comportement que je vis, mais il est soumis sous la version 4.6.0 de JDT-Core. –

Répondre

1

Apparantly, ce bug a été résolu par les changements introduits pour corriger bug 436091 contre JDT-core . Ce correctif doit être présent dans l'éclipse Mars.2 (4.5.2) et l'éclipse néon-M4 (4.6.0-M4).