Java枚举非常棒。仿制药也是。当然,我们都知道后者的局限性,因为类型擦除。但有一件事我不明白,为什么我不能创建这样的枚举:
public enum MyEnum {
LITERAL1,
LITERAL2,
LITERAL3;
}
此泛型类型参数
反过来,在不同的地方也会有用。设想一个方法的泛型类型参数:
public T getValue(MyEnum param);
或者甚至在枚举类本身中:
public T convert(Object o);
更具体的例子1
因为上面的例子对某些人来说可能太抽象了,下面是一个更现实的例子,说明我为什么要这样做。在这个例子中,我想使用
枚举,因为这样我可以枚举一组有限的属性键
泛型,因为这样我就可以有方法级的类型安全性来存储属性
public interface MyProperties {
public void put(MyEnum key, T value);
public T get(MyEnum key);
}
更具体的例子2
我列举了数据类型:
public interface DataType {}
public enum SQLDataType implements DataType {
TINYINT,
SMALLINT,
INT,
BIGINT,
CLOB,
VARCHAR,
...
}
显然,每个枚举文本将具有基于泛型类型的附加属性
同时,作为枚举(不可变、单例、可枚举等)
问题:
没人想到这个吗?这是与编译器相关的限制吗?考虑到这个事实,
枚举
“是作为语法糖实现的,它向JVM表示生成的代码,我不理解这一限制。
谁能向我解释这个?在回答之前,请考虑:
我知道通用类型被删除了:—)
我知道有使用类对象的解决方法。他们是解决办法。
如果适用,泛型类型将导致编译器生成的类型强制转换(例如,在调用convert()方法时)
泛型类型将位于枚举上。因此,它受枚举的每个文本的约束。因此编译器会知道,在编写类似
String string = LITERAL1.convert(myObject); Integer integer = LITERAL2.convert(myObject);
这同样适用于中的泛型类型参数
T getvalue()
方法。编译器可以在调用时应用类型转换
String string = someClass.getValue(LITERAL1)