Java 阿帕奇BeanUtils>;我可以为任何枚举实现注册通用转换器吗?
我有下面的Java 阿帕奇BeanUtils>;我可以为任何枚举实现注册通用转换器吗?,java,enums,apache-commons-beanutils,Java,Enums,Apache Commons Beanutils,我有下面的genericEnumConverter,它可以将任何字符串对象转换为相应的枚举 是否有一种方法可以为任何Enum类注册转换器,而不必显式注册每个Enum(例如,使用父Enum类) BeanUtilBean如何知道要使用哪个转换器?它知道目标类(例如,Foobar1)是否可分配给Enum我已经编写了一个API,用于使用JPA转换器工具转换Enum。编写将转换为任何枚举类或从任何枚举类转换而来的泛型转换器类的问题在于Java泛型在运行时被擦除。Java泛型的类型安全性在很大程度上只是编译
genericEnumConverter
,它可以将任何字符串
对象转换为相应的枚举
是否有一种方法可以为任何Enum
类注册转换器,而不必显式注册每个Enum
(例如,使用父Enum
类)
BeanUtilBean
如何知道要使用哪个转换器?它知道目标类(例如,Foobar1
)是否可分配给Enum
我已经编写了一个API,用于使用JPA转换器工具转换Enum。编写将转换为任何枚举类或从任何枚举类转换而来的泛型转换器类的问题在于Java泛型在运行时被擦除。Java泛型的类型安全性在很大程度上只是编译时的现象。除非每个要转换的枚举类型都有一个具体的转换器类,否则您的泛型转换器如何知道要使用哪种枚举类型?@scottb-请参阅更新部分。BeanUtilBean
应该可以访问它需要的所有信息…可能的重复项
ConvertUtilsBean convertUtilsBean = new ConvertUtilsBean();
PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();
BeanUtilsBean beanUtilsBean = new BeanUtilsBean(convertUtilsBean, propertyUtilsBean);
// custom converter = String->Enum
Converter genericEnumConverter = new Converter() {
@SuppressWarnings("unchecked")
@Override
public <T> T convert(Class<T> type, Object value) {
if (type.isEnum()) {
return (T) Optional
.ofNullable(value)
.map((v) -> Enum.valueOf((Class<? extends Enum>) type, v.toString()))
.orElse(null);
} else {
return null;
}
}
};
// explicitly defining an Enum implementation works...
convertUtilsBean.register(genericEnumConverter, FoobarEnum.class);
// but having a generic parent Enum class doesn't...
convertUtilsBean.register(genericEnumConverter, Enum.class);
private enum Foobar1 {CAT, DOG}
private enum Foobar2 {APPLE, BANANA}
public static void main(String[] args) {
System.out.println(genericEnumConverter.convert(Foobar1.class, "DOG")); // DOG
System.out.println(genericEnumConverter.convert(Foobar2.class, "APPLE")); // APPLE
System.out.println(Enum.class.isAssignableFrom(Foobar1.class)); // true
System.out.println(Foobar1.class.isAssignableFrom(Enum.class)); // false
}