Эта вещь беспокоит меня какое-то время. Я уже просил questions, но, вероятно, с плохой формулировкой и примером, который был слишком абстрактным. Поэтому было непонятно, что я на самом деле спрашивал. Я попробую еще раз. И, пожалуйста, не подходите к выводам. Я ожидаю, что ответить на вопрос нелегко!
Почему я не могу иметь перечисление с параметрами общего типа в 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
и генерики в отливки и синтетические методы.
, но почему компилятор не может пойти дальше и разрешить общие перечисления?
ИЗМЕНИТЬ: Это то, что я ожидал бы в виде кода Java, созданного компилятором:
public class DataType<T> extends Enum<DataType<?>> {
// [...]
}