Question sur l'utilisation d'Enum generique.
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
Code:
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
} |
J'ai créé une classe EnumParameter
Code:
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);
...
}
} |
Je créé deux EnumParameter avec deux types d'Enum différents que j'ajoute dans une map. Comme ceci.
Code:
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);
...
} |
Plus tard je veux récupérer par exemple la valeur de parameter1 pour l'assigner a un autre EnumParameter.
Code:
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()); |
Mis à part le warning ça fonctionne.
J'ai essayé de résoudre le warning avec <?>
Code:
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 ?) |
Je comprends l'erreur puisque le paramètre est de type EnumParameter<?> et j'essaie de luis passer un parametre de type Enum1.
Et donc comment éviter le Unchecked cast warning dans ce cas si c'est possible.
Merci d'éclairer ma lanterne.