J'ai un code générique que je n'arrive pas à comprendre pour empêcher légitimement d'obtenir des avertissements; J'utilise @SuppressWarnings ("non cochée") pour l'instant, car il semble que lancer un type générique ne peut pas être fait sans avertissements.Avertissements en Java lors de la conversion en type générique
Comment puis-je me débarrasser de l'annotation?
Ce que j'est:
public MyObject(SharedContext<Object> ctx) {
super(ctx); // set protected field 'context'
...
context.set("Input Fields" ,Collections.synchronizedMap(new TreeMap<String,Pair<String,Boolean>>(String.CASE_INSENSITIVE_ORDER)));
context.set("Output Fields" ,Collections.synchronizedMap(new TreeMap<String,String> (String.CASE_INSENSITIVE_ORDER)));
context.set("Event Registry",new EventRegistry(log) );
}
@SuppressWarnings("unchecked")
protected void startup() {
inputFields =(Map<String,Pair<String,Boolean>>)context.get("Input Fields" ,null);
outputFields =(Map<String,String> )context.get("Output Fields" ,null);
eventRegistry =(EventRegistry )context.get("Event Registry",null);
...
}
Le contexte est le type de variable protégée SharedContext<Object>
.
Sans l'annotation du compilateur donne des avertissements:
...\MyClass.java:94: warning: [unchecked] unchecked cast
found : java.lang.Object
required: java.util.Map<java.lang.String,com.mycompany.Pair<java.lang.String,java.lang.Boolean>>
inputFields =(Map<String,Pair<String,Boolean>>)context.get("Input Fields" ,null);
^
...\MyClass.java:95: warning: [unchecked] unchecked cast
found : java.lang.Object
required: java.util.Map<java.lang.String,java.lang.String>
outputFields =(Map<String,String> )context.get("Output Fields" ,null);
Personnellement, je considérerais que GenUtil.uncheckedCast' est pire que de supprimer un avertissement spécifique: Il n'y a aucune garantie que cette méthode utilitaire soit utilisée de manière responsable, c'est-à-dire d'une manière qui ne provoque pas de pollution, mais les programmeurs ne sont plus invités par un avertissement pour tenter une implémentation plus robuste. (Ce qui est parfois, mais pas toujours, possible ...) – meriton
Je ne suis pas d'accord - tout casting est essentiellement d'informer le compilateur "Je sais ce que le type de ceci est et vous n'avez pas, alors sortez de mon chemin et prenez mon mot pour cela ". L'avertissement émis dans cette circonstance ne devrait pas être là - c'est comme si le compilateur disait: «Je sais que je ne sais pas, mais je ne suis pas convaincu que vous le fassiez non plus». –
Le compilateur ne prend pas votre parole, il émet un contrôle d'exécution. Un casting peut être (et est parfois) utilisé comme assertion sur le type d'un objet. L'avertissement vous indique que cette vérification est incomplète et ne peut donc pas être invoquée. – meriton