java - 当定义为泛型类参数时,如何获取 Enum 的 valueOf 和值并调用其实现的接口(interface)上的方法

标签 java spring generics enums

我要转换String发送至Enum s 表示一组枚举类型。我使用一个接口(interface)来标记要转换的枚举集,并定义转换期间使用的几个方法:

public interface SymbolEnum {
    String getCode();       
    String getDescription();
}

这是 Enum 之一的示例我想从 String 派生的类型:

@RequiredArgsConstructor // using lombok
public enum Element implements SymbolEnum {

    IRON("FE", "iron"), 
    HYDROGEN("H", "hydrogen"),

    @Getter
    private final String code;
    @Getter
    private final String description;

}

如果字符串与枚举常量名称、枚举代码属性或枚举描述属性匹配,那么我想转换为该枚举。否则,代码应该抛出 IllegalArgumentException

我正在使用 Spring 的 Converter实现我的转换器的接口(interface)。 Converter参数化为Converter<S,T> 。我应该用什么 T ?我知道T应该延长Enum并实现SymbolEnum 。这是我尝试过的:

public class StringToSymbolEnum<T extends Enum<?> & SymbolEnum> implements Converter<String, T> {

    @Override
    public T convert(String source) {
        try {
            return T.valueOf(source); // compile error
        } catch (IllegalArgumentException notEnumConstant) {
            for (Enum enum : T.values()) { // compile error
                if (T.getDescription().equalsIgnoreCase(source) // compile error
                        || T.getCode().equalsIgnoreCase(source)) { // compile error
                    return T;
                }
            }
            throw notEnumConstant;
        }
    }

}

最佳答案

您需要将枚举的描述传递给 StringToSymbolEnum构造函数。也许是 Class<T> (用于 Enum.valueOf )或 T[]来自values .

注意,T应该定义:

T extends Enum<T> & SymbolEnum

而不是使用通配符。

关于java - 当定义为泛型类参数时,如何获取 Enum 的 valueOf 和值并调用其实现的接口(interface)上的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59779592/

相关文章:

c# - 泛型方法,使用where T : base. 为什么调用其他方法时不认为T是具体类型?

java - 计算你借了多少次

java - 我应该使用 javac -O 选项进行优化吗?

java - 在真实mysql系统中处理DELETE的最佳方法

java - 使用Spring的Oracle Db连接错误

java - 从泛型类java调用静态方法

Java 通用 Csv 字符串到枚举列表

java - 连接多个数组列表引用

java - 如何在 Java 中使用 MapEntry?

java - Spring框架中工厂的正确实现方法