这件事情困扰了我一段时间。我之前曾经提出过问题,但可能措辞有误,且示例过于抽象,所以并不清楚我的实际问题是什么。我会再试一次,请不要草率下结论。我预计这个问题很难回答!
为什么在Java中不能有带有泛型类型参数的枚举类?这个问题不是关于语法上为什么不可行,我知道它只是不受支持。问题是:为什么JSR人员“忘记”或“省略”了这个非常有用的功能?我无法想象与编译器相关的原因,为什么这不可行。
以下是我想要做的事情。这在Java中是可行的。这是创建类型安全枚举的Java 1.4方法:
现在,正如我所说的。我知道这些东西是按照这种方式设计的。枚举是语法糖。泛型也是。实际上,编译器完成所有工作,并将枚举转换为
但是,为什么编译器不能进一步允许泛型枚举呢?
编辑: 这就是我期望的编译器生成的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),
// [...]
}
现在,正如我所说的。我知道这些东西是按照这种方式设计的。枚举是语法糖。泛型也是。实际上,编译器完成所有工作,并将枚举转换为
java.lang.Enum
的子类,将泛型转换为强制转换和合成方法。但是,为什么编译器不能进一步允许泛型枚举呢?
编辑: 这就是我期望的编译器生成的Java代码:
public class DataType<T> extends Enum<DataType<?>> {
// [...]
}