Как создать метод, принимающий любой Enum в Java?

Имеется несколько Enum:

public enum Colours {
    RED, BLUE, WHITE;
}

public enum Modification {
    FULL, SIMPLE;
}

Как создать метод, который в качестве аргумента будет принимать любой типа перечисления (или TypeColour или Modification ) и возвращать значение, тип которого равен типу аргумента? Имеется множество перечислений и хочется сделать один универсальный метод:

Modification mod = getAnyEnum(Modification, "SIMPLE");
// mod = Modification.SIMPLE;

или

Colours col = getAnyEnum(Colours , "RED");
// mod = Modification.SIMPLE;

Чтобы получилось что-то типа такого:

private <E extends Enum<E>> E getAnyEnum(E type, String tagName) {
   //сделать что-то типа
   E newType = E.values(); //или метод valueOf();
   
   for(E type: list) {
       if(type.getValue.equals(tagName)) {
           return type;
       }
   }
}

Ответы (1 шт):

Автор решения: kami

Это - перевод ответа https://stackoverflow.com/a/1723239/4908529

Обратите внимание на комментарии: основные претензии - к пустому catch-блоку, что считается моветоном. Публикуемый метод возвращает NULL, если значение, соответствующее строковому представлению не найдено.

/**
 * A common method for all enums since they can't have another base class
 * @param <T> Enum type
 * @param c enum type. All enums must be all caps.
 * @param string case insensitive
 * @return corresponding enum, or null
 */
public static <T extends Enum<T>> T getEnumFromString(Class<T> c, String string) {
    if( c != null && string != null ) {
        try {
            return Enum.valueOf(c, string.trim().toUpperCase());
        } catch(IllegalArgumentException ex) {
        }
    }
    return null;
}

Пример использования:

public static MyEnum fromString(String name) {
    return getEnumFromString(MyEnum.class, name);
}

Если значения вашего Enum использует не только заглавные буквы - нужно будет изменить часть кода string.trim().toUpperCase() на более подходящую для вашей нотации.

→ Ссылка