Apache BeanUtils>我可以为任何Enum实现注册通用转换器吗?

时间:2017-05-23 23:53:06

标签: java enums apache-commons-beanutils

我有以下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

0 个答案:

没有答案