Groovy编写通用枚举工具类解析逗号分隔字符串为枚举列表问题
问题根源
你当前的写法存在两个核心问题:
- Java 调用带泛型的静态方法时,泛型参数的指定语法错误,正确的泛型指定语法是
类名.<泛型>方法名(参数),而非将泛型放在方法名后。 - 更本质的问题是:Java 泛型仅为编译期的类型校验标识,无法通过泛型参数
E直接调用对应枚举类的静态方法valueOfText,且静态方法不支持多态继承,你定义的所有枚举类的valueOfText方法没有统一的上层约束,工具方法中直接写E.valueOfText本身就无法编译通过。另外你原有代码中静态方法内使用this调用静态常量也是语法错误,静态方法不存在this引用。
正确实现方案
我们可以通过Java 8的函数式接口,把对应枚举的valueOfText方法作为参数传入工具方法,即可实现通用能力:
修正后的EnumUtils代码
import java.util.Arrays; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; public final class EnumUtils { public static final String LIST_SEPARATOR = ","; public static <E extends Enum<E>> List<E> createFromText(String text, Function<String, E> valueOfTextFunc) { // 入参非空判断,避免空指针 if (text == null || text.trim().isEmpty()) { return List.of(); } List<String> textList = Arrays.asList(text.split(LIST_SEPARATOR)); return textList.stream() .map(String::trim) // 兼容带空格的分隔格式,比如 "A , S" .map(valueOfTextFunc) .collect(Collectors.toList()); } }
调用方式
List<Frequency> frequencies = EnumUtils.createFromText(row[3], Frequency::valueOfText);
这种写法不需要手动指定泛型,编译器会自动根据你传入的方法引用推断返回的枚举类型,完全规避了泛型指定的语法错误,且对所有定义了valueOfText方法的枚举都通用。
内容的提问来源于stack exchange,提问作者Mike Warren
相关产品推荐
相关产品推荐

