Java-Enums sind großartig. Generika auch. Natürlich kennen wir alle die Einschränkungen des letzteren aufgrund der Typlöschung. Aber eines verstehe ich nicht: Warum kann ich so eine Aufzählung nicht erstellen:
public enum MyEnum<T> {
LITERAL1<String>,
LITERAL2<Integer>,
LITERAL3<Object>;
}
Dieser generische Typparameter <T>
könnte dann wiederum an verschiedenen Stellen nützlich sein. Stellen Sie sich einen generischen Typparameter für eine Methode vor:
public <T> T getValue(MyEnum<T> param);
Oder sogar in der Enum-Klasse selbst:
public T convert(Object o);
Konkreteres Beispiel Nr. 1
Da das obige Beispiel für manche zu abstrakt erscheint, ist hier ein realistischeres Beispiel dafür, warum ich dies tun möchte. In diesem Beispiel möchte ich verwenden
- Aufzählungen, weil ich dann einen endlichen Satz von Eigenschaftsschlüsseln aufzählen kann
- Generika, weil ich dann Typensicherheit auf Methodenebene zum Speichern von Eigenschaften haben kann
public interface MyProperties {
public <T> void put(MyEnum<T> key, T value);
public <T> T get(MyEnum<T> key);
}
Konkreteres Beispiel Nr. 2
Ich habe eine Aufzählung von Datentypen:
public interface DataType<T> {}
public enum SQLDataType<T> implements DataType<T> {
TINYINT<Byte>,
SMALLINT<Short>,
INT<Integer>,
BIGINT<Long>,
CLOB<String>,
VARCHAR<String>,
...
}
Jedes Aufzählungsliteral hätte offensichtlich zusätzliche Eigenschaften, die auf dem generischen Typ basieren <T>
, während es gleichzeitig eine Aufzählung ist (unveränderlich, singleton, aufzählbar usw. usw.).
Frage:
Hat niemand daran gedacht? Ist dies eine compilerbezogene Einschränkung? In Anbetracht der Tatsache, dass das Schlüsselwort " enum " als syntaktischer Zucker implementiert ist und generierten Code für die JVM darstellt, verstehe ich diese Einschränkung nicht.
Wer kann mir das erklären? Beachten Sie Folgendes, bevor Sie antworten:
- Ich weiß, dass generische Typen gelöscht werden :-)
- Ich weiß, dass es Problemumgehungen mit Klassenobjekten gibt. Sie sind Problemumgehungen.
- Generische Typen führen gegebenenfalls zu vom Compiler generierten Typumwandlungen (z. B. beim Aufrufen der convert () -Methode
- Der generische Typ <T> würde in der Aufzählung stehen. Daher ist es an jedes Literal der Aufzählung gebunden. Daher würde der Compiler wissen, welchen Typ er beim Schreiben von so etwas anwenden soll
String string = LITERAL1.convert(myObject); Integer integer = LITERAL2.convert(myObject);
- Gleiches gilt für den generischen Typparameter in der
T getvalue()
Methode. Der Compiler kann beim Aufruf Type Casting anwendenString string = someClass.getValue(LITERAL1)
enum
Folgendes : Verwandeln Sie das in eine "typsichere Aufzählung", die wir vor Java 1.5 verwendet haben. Plötzlich können Sie Ihre Enum-Mitglieder parametrisieren lassen. Das werde ich jetzt wahrscheinlich tun.