2016-12-14 7 views
-1

Как удалить @SuppressWarnings("unchecked") в следующем коде?Generic Enum Parser без предупреждения без предупреждения

public <T extends Enum<T>> T getEnum(String key, T dflt) { 
    final String value = properties.getProperty(key, dflt.name()); 
    @SuppressWarnings("unchecked") 
    final Class<T> clazz = (Class<T>)dflt.getClass(); 
    return Enum.valueOf(clazz, value); 
} 
+0

Эта строка: окончательный Класс clazz = (Класс ) dflt.getClass(); просто предоставьте предупреждение. Вы не можете удалить это, потому что это приведение небезопасно. – thepaulo

+1

не совсем понятно, что вы просите. Вы хотите, чтобы код компилировался без предупреждений, а также без аннотации SuppressWarnings? – user152468

+1

Но я думаю, что вы также можете использовать: final Class clazz = dflt.getDeclaringClass(); – thepaulo

ответ

5

Все 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 для этих классов.