Фабричный конвертер для Enums, реализующий определенный интерфейс - PullRequest
0 голосов
/ 22 января 2020

В ядре Spring do c он дает пример того, как написать фабрику преобразователей для всей иерархии классов, например, классов, расширяющих Enum. Это позволяет использовать общий код для преобразования строк в перечисления.

Я хотел бы дополнительно ограничить фабрику преобразователей для преобразования строк только в перечисления, которые реализуют определенный интерфейс. Как я могу это сделать? Мне нужен конвертер, чтобы иметь возможность вызывать методы интерфейса, а также методы, определенные в классе Enum. Вот моя попытка:

final class StringToEnumConverterFactory implements ConverterFactory<String, Enum<? extends MyInterface>> {

    public <T extends Enum<? extends MyInterface>> Converter<String, T> getConverter(Class<T> targetType) {
        return new StringToEnumConverter<T>(targetType);
    }

    private final class StringToEnumConverter<T extends Enum<? extends MyInterface>> implements Converter<String, T> {

        private Class<T> enumType;

        public StringToEnumConverter(Class<T> enumType) {
            this.enumType = enumType;
        }

        public T convert(String source) {
            enumType.getEnumConstants()[0].getDetails(); // doesn't compile. getDetails is defined on MyInterface
            return (T) Enum.valueOf(this.enumType, source.trim()); // doesn't compile
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...