Java 如何创建通用枚举转换器?
我想写一个泛型类,可以像Java 如何创建通用枚举转换器?,java,generics,enums,Java,Generics,Enums,我想写一个泛型类,可以像newenumconverter(MyEnum.class)那样使用 但是我必须编写这个类,以便它能够与对enum.values()的泛型调用一起工作 公共类枚举转换器{ 公共EnumConverter(候选类:type.getDeclaringClass().getEnumConstants()){ if(candidate.name().equalsIgnoreCase(文本)){ 返回候选人; } } } } 方法转换的返回类型错误:应该是Enum而不是EnumCo
newenumconverter(MyEnum.class)那样使用代码>
但是我必须编写这个类,以便它能够与对enum.values()
的泛型调用一起工作
公共类枚举转换器{
公共EnumConverter(候选类:type.getDeclaringClass().getEnumConstants()){
if(candidate.name().equalsIgnoreCase(文本)){
返回候选人;
}
}
}
}
方法转换的返回类型错误:应该是Enum
而不是EnumConverter
。然后,您不必调用getDeclaringClass()
,而是使用类型中已有的Class
我建议采用更为通用的方法:
public static class EnumConverter<T extends Enum<T>>
{
Class<T> type;
public EnumConverter(Class<T> type)
{
this.type = type;
}
public Enum<T> convert(String text)
{
for (Enum<T> candidate : type.getEnumConstants()) {
if (candidate.name().equalsIgnoreCase(text)) {
return candidate;
}
}
return null;
}
}
公共静态类枚举转换器
{
班级类型;
公共枚举转换器(类类型)
{
this.type=type;
}
公共枚举转换(字符串文本)
{
对于(枚举候选:type.getEnumConstants()){
if(candidate.name().equalsIgnoreCase(文本)){
返回候选人;
}
}
返回null;
}
}
您的问题不一致,代码无效:
1) 未将this.type定义为字段
2) 您可以定义convert to returnEnumConverter
,但返回Enum
要从文本中返回枚举的枚举值,不需要使用泛型内容。您只需使用:
Enum.valueOf(MyEnum.class, "TWO")
以防有些人在寻找替代解决方案时不使用for循环
// classType is target Enum
public static Enum<?> toEnum(final Class<? extends Enum> classType, final Enum<?> enumObj) {
if (enumObj == null) {
return null;
} else {
return enumObj.valueOf(classType, enumObj + "");
}
下面的类与request不同,但与其他一些答案相比还是有所改进,因为它不会产生警告(Java11/IDEA 2020)
静态Dest
convertEnumStrict(最终类destinationClassType,最终枚举sourceEnum){
if(sourceEnum==null){
返回null;
}
返回Dest.valueOf(destinationClassType,sourceEnum.name());
}
静态目的地
convertEnumOrNull(最终类destinationClassType,最终枚举sourceEnum){
试一试{
返回convertEnumStrict(destinationClassType,sourceEnum);
}捕获(IllegalArgumentException e){
返回null;
}
}
把两个最好的答案放在一起,你会得到一个清晰的答案:
public <T extends Enum<T>> T getEnumValue(Class<T> type, String str) {
return Enum.valueOf(type, str);
}
public T getEnumValue(类类型,字符串str){
返回枚举值of(类型,str);
}
这是什么类型的。type;它是如何声明的?您的convert方法有问题,因为它应该返回EnumConverter
,而candidate
的类型是Enum
!!我认为这是一个建构主义者,我绝对不清楚问题是什么,问得好。这是相关的,但不同:(请不要把这个评论读成‘嘿,这个问题是个骗局!’)这正是我想要的。但是这不能进一步优化吗,因为我必须提供类型参数作为泛型参数和构造函数参数,比如newenumconverter(MyEnum.class)代码>或<代码>新建EnumConverter()代码>?为什么使用这个类与使用Enum.valueOf((类enumType,字符串名)
?我在写这个答案时不知道Enum.valueOf()-方法,只是想说明如何让他的方法工作。也许你可以用它来跟踪转换;-)@membersound可以通过在通用静态方法中进行转换来进一步优化它。但是您可以直接使用Enum.valueOf()。
TestEnum1 enum1 = (TestEnum1) toEnum(TestEnum1.class, TestEnum1.HELLO_ENUM);
static <Dest extends Enum<Dest>> Dest
convertEnumStrict(final Class<Dest> destinationClassType, final Enum<?> sourceEnum) {
if (sourceEnum == null) {
return null;
}
return Dest.valueOf(destinationClassType, sourceEnum.name());
}
static <Dest extends Enum<Dest>> Dest
convertEnumOrNull(final Class<Dest> destinationClassType, final Enum<?> sourceEnum) {
try {
return convertEnumStrict(destinationClassType, sourceEnum);
} catch (IllegalArgumentException e) {
return null;
}
}
public <T extends Enum<T>> T getEnumValue(Class<T> type, String str) {
return Enum.valueOf(type, str);
}