Bonjour amis développeurs.
Je me pose des questions à propos de l'utilisation de types générique avec les Enum. Mon code fonctionne correctement mais il y a des warnings que je n'arrive pas a comprendre.
J'ai une classe Parameter generique qui contient les méthodes setValue et getValue paramétrées
J'ai créé une classe EnumParameter
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 public class Parameter<T> { //... des truc avant public void setValue(final T _value) { value = _value; } synchronized public T getValue() { return value; } //... des truc après }
Je créé deux EnumParameter avec deux types d'Enum différents que j'ajoute dans une map. Comme ceci.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public class EnumParameter<T extends Enum<T>> extends Parameter<T> { public EnumParameter(final Class<T> _enumType) { super(_enumType); ... } }
Plus tard je veux récupérer par exemple la valeur de parameter1 pour l'assigner a un autre EnumParameter.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 { ... EnumParameter<Enum1> parameter1 = new EnumParameter<>(Enum1.class); EnumParameter<Enum2> parameter2 = new EnumParameter<>(Enum2.class); parameter1.setValue(Enum1.TRUC); parameter2.setValue(Enum2.MACHIN); parametersMap.put(parameter1ID, parameter1); parametersMap.put(parameter2ID, parameter2); ... }
Mis à part le warning ça fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 final EnumParameter<Enum1> parameter1 = (EnumParameter<Enum1>)getParameter(parameter1ID); // WARNING : Type safety: Unchecked cast from Parameter<capture#31-of ?> to EnumParameter<Enum1> final EnumParameter<Enum1> parameter3 = (EnumParameter<Enum1>)getParameter(parameter3ID); // WARNING : Type safety: Unchecked cast from Parameter<capture#31-of ?> to EnumParameter<Enum1> parameter3.setValue(parameter1 .getValue());
J'ai essayé de résoudre le warning avec <?>
Je comprends l'erreur puisque le paramètre est de type EnumParameter<?> et j'essaie de luis passer un parametre de type Enum1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 final EnumParameter<?> parameter1 = (EnumParameter<?>)getParameter(parameter1ID); // Plus de warning final EnumParameter<?> parameter3 = (EnumParameter<?>)getParameter(parameter3ID); // Plus de warning parameter3.setValue(parameter1 .getValue()); // ERREUR : The method setValue(capture#35-of ?) in the type Parameter<capture#35-of ?> is not applicable for the arguments (capture#36-of ?)
Et donc comment éviter le Unchecked cast warning dans ce cas si c'est possible.
Merci d'éclairer ma lanterne.
Partager