2017-09-25 4 views
1

Existe-t-il un moyen de forcer le compilateur à vérifier si j'utilise les mêmes annotations dans la méthode enfant que dans la méthode parent. Si j'utilise @NotNull et String tout fonctionne comme prévu.@Override ne force pas l'utilisation d'annotation enum dans les méthodes surchargées

public static final int FIRST_ENUM = 0; 
public static final int SECOND_ENUM = 1; 

@IntDef(value = { 
     FIRST_ENUM, 
     SECOND_ENUM 
}) 
@Retention(RetentionPolicy.SOURCE) 
public @interface MyEnum { 
} 

class Parent { 
    public void method(@MyEnum int a) { 
    } 
} 

class Child extends Parent { 
    @Override 
    public void method(int a) { // This is valid otherwise there is no @MyEnum 
    } 
} 

Ce code est valide bien que je ne remplace pas toutes les annotations.

Répondre

0

Pour que le compilateur vérifie la cohérence de vos annotations, vous devez exécuter un processeur d'annotations pendant la compilation. Vous pouvez le faire en utilisant le drapeau standard javac -processor. Lorsqu'il est exécuté sans processeur d'annotation, le compilateur écrit la plupart des annotations dans des fichiers .class mais ne vérifie pas leur sémantique.

Vous pouvez définir votre propre processeur d'annotation ou en utiliser un écrit par quelqu'un d'autre. Le Fake Enum Checker du Checker Framework peut vérifier l'utilisation correcte de votre annotation @MyEnum au moment de la compilation.

+0

Merci pour votre suggestion, mais j'ai besoin de vérifier les annotations dans Android Studio et Android Studio certains vérifient automatiquement. par exemple 'int sth = 10;' '@MyEnum int num = sth;/* sans erreur (mauvais) */'' num = sth;/* erreur affichée (ok) */'Peut-être que toutes les vérifications ne sont pas encore implémentées ... – mmrmartin

+0

Vous pouvez soumettre un rapport de bogue à l'équipe Android Studio et attendre qu'ils le résolvent. Jusque-là, vous pouvez utiliser un outil tiers comme le [Enum Checker] (https://checkerframework.org/manual/#fenum-checker). – mernst