这件事让我困扰了一段时间.以前我曾问过
questions,可能是一个不好的措辞和一个太抽象的例子.所以不清楚我实际在问什么.我会再尝试.请不要跳过结论.我期待这个问题根本不容易回答!
为什么我不能在Java中具有泛型类型参数的枚举?
问题不在于为什么不可能在语法上.我知道只是不支持.问题是:JSR为什么“忘记”或“省略”这个非常有用的功能?我无法想象与编译器有关的原因,为什么不可行.
这是我想做的事情.这在Java中是可能的.这是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 ... ]
}
然后,您可以使用< T>在许多其他地方
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),
// [...]
}
现在,正如我所说.我知道这些东西都是这样设计的.枚举是句法糖.仿制药也是如此.实际上,编译器完成所有的工作,并将枚举转换成java.lang.Enum和泛型的子类到转换和合成方法.
但是为什么编译器不能进一步,并允许通用枚举?
编辑:
这是我期望的编译器生成的Java代码:
public class DataType extends Enum> {
// [...]
}