Как получить valueOf & значения Enum и вызвать методы в интерфейсе, который он реализует, когда он определен как универсальный параметр класса c - PullRequest
0 голосов
/ 17 января 2020

Я хочу преобразовать String с в Enum с для набора типов перечислений. Я использую интерфейс, чтобы отметить какой набор перечислений для преобразования и определить пару методов, используемых во время преобразования:

public interface SymbolEnum {
    String getCode();       
    String getDescription();
}

Вот пример одного из Enum типов, которые я хочу получить из String:

@RequiredArgsConstructor // using lombok
public enum Element implements SymbolEnum {

    IRON("FE", "iron"), 
    HYDROGEN("H", "hydrogen"),

    @Getter
    private final String code;
    @Getter
    private final String description;

}

Если строка соответствует имени константы перечисления, свойству кода перечисления или свойству описания перечисления, то я хочу преобразовать в это перечисление. В противном случае код должен выдать IllegalArgumentException.

Я использую интерфейс Spring Converter для реализации моего конвертера. Converter параметрируется как Converter<S,T>. Что я должен использовать для T? Я знаю, что T должен расширить Enum и реализовать SymbolEnum. Вот что я попробовал:

public class StringToSymbolEnum<T extends Enum<?> & SymbolEnum> implements Converter<String, T> {

    @Override
    public T convert(String source) {
        try {
            return T.valueOf(source); // compile error
        } catch (IllegalArgumentException notEnumConstant) {
            for (Enum enum : T.values()) { // compile error
                if (T.getDescription().equalsIgnoreCase(source) // compile error
                        || T.getCode().equalsIgnoreCase(source)) { // compile error
                    return T;
                }
            }
            throw notEnumConstant;
        }
    }

}

1 Ответ

1 голос
/ 17 января 2020

Вам необходимо передать описание перечисления конструкторам StringToSymbolEnum. Возможно, либо Class<T> (для использования в Enum.valueOf), либо T[] из values.

Примечание. T должно быть определено:

T extends Enum<T> & SymbolEnum

Вместо использования подстановочный знак.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...