В ядре 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
}
}
}