我有以下genericEnumConverter
可以将String
对象转换为相应的Enum
。
我是否可以为任何 Enum
类注册转换器,而不必显式注册每个Enum
(例如使用父Enum
} class)?
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);
@scottb:
因为转换器是通用的,所以可以使用任何Enum类。 e.g。
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
}
BeanUtilBean
如何知道使用哪个转换器?它知道目标类(例如Foobar1
)是否可分配给Enum
。