Les énumérations Java sont excellentes. Les génériques aussi. Bien sûr, nous connaissons tous les limites de ce dernier en raison de l'effacement de type. Mais il y a une chose que je ne comprends pas, pourquoi ne puis-je pas créer une énumération comme celle-ci:
public enum MyEnum<T> {
LITERAL1<String>,
LITERAL2<Integer>,
LITERAL3<Object>;
}
Ce paramètre de type générique peut <T>
à son tour être utile à divers endroits. Imaginez un paramètre de type générique pour une méthode:
public <T> T getValue(MyEnum<T> param);
Ou même dans la classe enum elle-même:
public T convert(Object o);
Exemple plus concret n ° 1
Étant donné que l'exemple ci-dessus peut sembler trop abstrait pour certains, voici un exemple plus réel de la raison pour laquelle je veux faire cela. Dans cet exemple, je souhaite utiliser
- Enums, car je peux alors énumérer un ensemble fini de clés de propriété
- Génériques, car alors je peux avoir une sécurité de type au niveau de la méthode pour stocker les propriétés
public interface MyProperties {
public <T> void put(MyEnum<T> key, T value);
public <T> T get(MyEnum<T> key);
}
Exemple plus concret n ° 2
J'ai une énumération de types de données:
public interface DataType<T> {}
public enum SQLDataType<T> implements DataType<T> {
TINYINT<Byte>,
SMALLINT<Short>,
INT<Integer>,
BIGINT<Long>,
CLOB<String>,
VARCHAR<String>,
...
}
Chaque littéral d'énumération aurait évidemment des propriétés supplémentaires basées sur le type générique <T>
, tout en étant en même temps une énumération (immuable, singleton, énumérable, etc.)
Question:
Personne n'y a pensé? Est-ce une limitation liée au compilateur? Compte tenu du fait que le mot-clé " enum " est implémenté en tant que sucre syntaxique, représentant du code généré vers la JVM, je ne comprends pas cette limitation.
Qui peut m'expliquer cela? Avant de répondre, considérez ceci:
- Je sais que les types génériques sont effacés :-)
- Je sais qu'il existe des solutions de contournement utilisant des objets de classe. Ce sont des solutions de contournement.
- Les types génériques entraînent des casts de type générés par le compilateur le cas échéant (par exemple lors de l'appel de la méthode convert ()
- Le type générique <T> serait sur l'énumération. Par conséquent, il est lié par chacun des littéraux de l'énumération. Par conséquent, le compilateur saurait quel type appliquer lors de l'écriture de quelque chose comme
String string = LITERAL1.convert(myObject); Integer integer = LITERAL2.convert(myObject);
- La même chose s'applique au paramètre de type générique dans la
T getvalue()
méthode. Le compilateur peut appliquer la conversion de type lors de l'appelString string = someClass.getValue(LITERAL1)
enum
en un idiome "typesafe enum" que nous utilisions avant Java 1.5. Soudainement, vous pouvez paramétrer vos membres enum. C'est probablement ce que je vais faire maintenant.