Все Enum<E>
подклассы есть метод, который возвращает его Class
, что правильно параметризованных.
public <T extends Enum<T>> T getEnum(String key, T dflt) {
final String value = properties.getProperty(key, dflt.name());
final Class<T> clazz = dflt.getDeclaringClass();
return Enum.valueOf(clazz, value);
}
EDIT: Ваше предыдущее решение НЕПРАВИЛЬНО, а не просто плохой стиль.
public final Class<E> getDeclaringClass()
Возвращает объект класса, соответствующего типу перечисления Данное перечисление Констана. Две константы enum e1 и e2 имеют один и тот же тип перечисления тогда и только тогда, когда e1.getDeclaringClass() == e2.getDeclaringClass(). (Значение, возвращаемое этот метод, может отличаться от возвращаемого метода object.getClass() для перечисления констант с постоянная конкретными органами класса.)
Enum.valueOf(Class, String)
может жаловаться, если Class
проходил в это Class
для «констант континуума с постоянными конкретными классами тела». Class.isEnum()
вернет false
для этих классов.
Эта строка: окончательный Класс clazz = (Класс ) dflt.getClass(); просто предоставьте предупреждение. Вы не можете удалить это, потому что это приведение небезопасно. –
thepaulo
не совсем понятно, что вы просите. Вы хотите, чтобы код компилировался без предупреждений, а также без аннотации SuppressWarnings? – user152468
Но я думаю, что вы также можете использовать: final Class clazz = dflt.getDeclaringClass(); –
thepaulo