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