Java 枚举和泛型
这件事已经困扰了我一段时间了。我以前问过问题,但可能是措辞不好,例子太抽象了。所以不清楚我到底在问什么。我会再试一次。请不要妄下结论。我希望这个问题根本不容易回答!
为什么我不能在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<?>> {
// [...]
}