爪哇枚举是伟大的。仿制药也是。当然,我们都知道后者的局限性,因为类型擦除。但有一件事我不明白,为什么我不能创建这样的枚举:
public enum MyEnum<T> {
LITERAL1<String>,
LITERAL2<Integer>,
LITERAL3<Object>;
}
然后,这个泛型类型参数 <T>
可能在各种场合都很有用。设想一个方法的泛型类型参数:
public <T> T getValue(MyEnum<T> param);
甚至在枚举类本身:
public T convert(Object o);
因为上面的例子对于某些人来说可能太抽象了,这里有一个更加现实的例子来说明我为什么要这样做。在这个例子中,我想使用
public interface MyProperties {
public <T> void put(MyEnum<T> key, T value);
public <T> T get(MyEnum<T> key);
}
我有一个数据类型的枚举:
public interface DataType<T> {}
public enum SQLDataType<T> implements DataType<T> {
TINYINT<Byte>,
SMALLINT<Short>,
INT<Integer>,
BIGINT<Long>,
CLOB<String>,
VARCHAR<String>,
...
}
每个枚举文字显然都有基于泛型类型 <T>
的附加属性,同时,作为枚举(不可变、单例、可枚举等等)
没人想到这点吗?这是编译器相关的限制吗?考虑到关键字“ 枚举”是作为语法糖实现的,表示生成的代码到 JVM,我不明白这个限制。
谁能给我解释一下? 在你回答之前,想想这个:
String string = LITERAL1.convert(myObject); Integer integer = LITERAL2.convert(myObject);
的代码时应用哪种类型T getvalue()
方法中的泛型类型参数。编译器可以在调用 String string = someClass.getValue(LITERAL1)
时应用类型强制转换