【发布时间】:2011-02-24 18:14:37
【问题描述】:
这件事让我困扰了一段时间。我之前问过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<?>> {
// [...]
}
【问题讨论】:
-
好吧,我说我再次问了这个问题,但措辞更清晰,因为另一个问题只是给了我垃圾答案(在我看来)。我宁愿关闭另一个...
-
@Lukas Eder 所以改进原始问题。重新提问似乎没有帮助。
-
这不是可行性问题,而是这实际上会破坏部署的问题?另外,你为什么需要这个功能?
-
我之前在stackoverflow上做过,然后我被批评并被告知要问一个新问题......你们能下定决心吗? :)