Java enums sont grands. Donc, sont des génériques. Bien sûr, nous connaissons tous les limites de cette dernière en raison de type de l'effacement. Mais une chose que je ne comprends pas. Pourquoi ne puis-je pas créer un enum comme ceci:
public enum MyEnum<T> {
LITERAL1<String>,
LITERAL2<Integer>,
LITERAL3<Object>;
}
Ce paramètre de type générique <T>, à son tour, pourrait alors être utile dans différents endroits. Imaginez un paramètre de type générique à une méthode:
public <T> T getValue(MyEnum<T> param);
Ou même dans l'énumération de la classe elle-même:
public T convert(Object o);
Mise à JOUR: Depuis la un exemple ci-dessus semble trop abstrait pour certains, voici un exemple de pourquoi je veux faire ce. Dans cet exemple, je veux utiliser
- Les Enums, parce que je peux énumérer un ensemble fini de propriété touches
- Les génériques, parce que je peux avoir de la méthode de niveau de type de sécurité pour le stockage des propriétés
public interface MyProperties {
public <T> void put(MyEnum<T> key, T value);
public <T> T get(MyEnum<T> key);
}
Personne n'a penser à cela? Est-ce un compilateur limitation? Compte tenu du fait que le mot-clé "enum" est mis en œuvre en tant que sucre syntaxique, représentant le code généré pour la JVM, je ne comprends pas cette limitation.
Qui peut-il m'expliquer cela? Avant de vous répondre, réfléchissez à ceci:
- Je sais que les types génériques sont effacés :-)
- Je sais qu'il existe des solutions de contournement en utilisant des objets de la Classe. Ils sont des solutions de contournement.
- Types génériques résultat généré par le compilateur le type jette là où applicable (par exemple, lors de l'appel de la fonction convert() la méthode
- Le générique de type <T> serait sur les enum. Par conséquent, il est lié par chacune des enum littéraux. Donc le compilateur sait, à 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 pour le paramètre de type générique dans l'
T getvalue()
méthode. Le compilateur peut appliquer la conversion de type lors de l'appel d'String string = someClass.getValue(LITERAL1)