Эта штука беспокоит меня некоторое время. Я задавал вопросы и раньше, но, вероятно, с плохой формулировкой и примером, который был слишком абстрактным. Так что не было ясно, о чем я на самом деле спрашивал. Я попробую еще раз. И, пожалуйста, не спешите с выводами. Я ожидаю, что на этот вопрос нелегко ответить!
почему я не могу иметь перечисление с параметрами универсального типа в Java?
Вопрос не в том, почему это невозможно, синтаксически. Я знаю, что это просто не поддерживается. Вопрос в том, почему люди из JSR «забыли» или «пропустили» эту очень полезную функцию? Я не могу представить причину, связанную с компилятором, почему это было бы невозможно.
Вот что я хотел бы сделать. Это возможно в Java. Это способ Java 1.4 для создания типов безопасных перечислений:
// A model class for SQL data types and their mapping to Java types
public class DataType<T> implements Serializable, Comparable<DataType<T>> {
private final String name;
private final Class<T> type;
public static final DataType<Integer> INT = new DataType<Integer>("int", Integer.class);
public static final DataType<Integer> INT4 = new DataType<Integer>("int4", Integer.class);
public static final DataType<Integer> INTEGER = new DataType<Integer>("integer", Integer.class);
public static final DataType<Long> BIGINT = new DataType<Long> ("bigint", Long.class);
private DataType(String name, Class<T> type) {
this.name = name;
this.type = type;
}
// Returns T. I find this often very useful!
public T parse(String string) throws Exception {
// [...]
}
// Check this out. Advanced generics:
public T[] parseArray(String string) throws Exception {
// [...]
}
// Even more advanced:
public DataType<T[]> getArrayType() {
// [...]
}
// [ ... more methods ... ]
}
И тогда вы можете использовать <T>
во многих других местах
public class Utility {
// Generic methods...
public static <T> T doStuff(DataType<T> type) {
// [...]
}
}
Но эти вещи невозможны с перечислением:
// This can't be done
public enum DataType<T> {
// Neither can this...
INT<Integer>("int", Integer.class),
INT4<Integer>("int4", Integer.class),
// [...]
}
Теперь, как я уже сказал. Я знаю, что эти вещи были разработаны именно таким образом. enum
является синтаксическим сахаром. Как и дженерики. Фактически, компилятор выполняет всю работу и преобразует enums
в подклассы java.lang.Enum
, а дженерики - в приведение и синтетические методы.
но почему компилятор не может идти дальше и допускать общие перечисления ??
EDIT :
Это то, что я ожидал бы как сгенерированный компилятором Java-код:
public class DataType<T> extends Enum<DataType<?>> {
// [...]
}