Java枚举非常棒。泛型也是如此。当然,由于类型擦除,我们都知道后者的局限性。但有一件事我不明白,为什么我不能创建这样的枚举:
public enum MyEnum<T> {
LITERAL1<String>,
LITERAL2<Integer>,
LITERAL3<Object>;
}
这样,这个泛型类型参数<T>
就可以在不同的地方发挥作用。想象一下一个方法的泛型类型参数:
public <T> T getValue(MyEnum<T> param);
或者甚至在枚举类本身中:
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>
的附加属性,同时又是一个枚举(不可变、单例、可枚举等)。
问题:
没人想到这一点吗?这是与编译器相关的限制吗?考虑到关键字“JVM ”被实现为语法糖,向表示生成的代码,我不理解这个限制。
谁能给我解释一下?在回答之前,请考虑以下内容:
String string = LITERAL1.convert(myObject); Integer integer = LITERAL2.convert(myObject);
T getvalue()
方法中的泛型类型参数。编译器可以在调用String string = someClass.getValue(LITERAL1)
时应用类型转换
发布于 2021-05-26 00:43:56
通过使用这个Java https://github.com/cmoine/generic-enums,您可以编写类似这样的代码( convert方法是作为示例实现的):
import org.cmoine.genericEnums.GenericEnum;
import org.cmoine.genericEnums.GenericEnumParam;
@GenericEnum
public enum MyEnum {
LITERAL1(String.class) {
@Override
@GenericEnumParam
public Object convert(Object o) {
return o.toString(); // example
}
},
LITERAL2(Integer.class) {
@Override
@GenericEnumParam
public Object convert(Object o) {
return o.hashCode(); // example
}
},
LITERAL3(Object.class) {
@Override
@GenericEnumParam
public Object convert(Object o) {
return o; // example
}
};
MyEnum(Class<?> clazz) {
}
@GenericEnumParam
public abstract Object convert(Object o);
}
注释处理器将生成一个枚举MyEnumExt
(可定制的),它克服了java枚举的限制。相反,它生成一个可用作枚举的Java类(最后,枚举被编译成实现Enum
!的Java类)。
https://stackoverflow.com/questions/4290878
复制相似问题