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