2016-03-09 2 views
2

У меня есть класс, который содержит набор Valueloaders, которые обрабатывают значения типа T. Вот как я создал класс. Однако этот класс генерирует предупреждение о непроверенном литье в строке 39 return (ValueLoader<T>) loader;предупреждение о непроверенном отбрасывании на оператор return

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

public enum ValueLoaderRegistry { 

REGISTRY; 

private transient Map<Class<?>, ValueLoader<?>> map = new HashMap<Class<?>, ValueLoader<?>>(); 

private ValueLoaderRegistry() { 
    initialize(); 
} 

private void initialize() { 
    map.put(Integer.class, new IntegerValueLoader()); 
    map.put(String.class, new StringValueLoader()); 
    map.put(Double.class, new DoubleValueLoader()); 
    map.put(Boolean.class, new BooleanValueLoader()); 
    map.put(Regions.class, new RegoinsValueLoader()); 

} 



@SuppressWarnings("unchecked") 
public <T> ValueLoader<T> getLoader(Class<T> key){ 
    //Suppress unchecked cast warning, as by design we are making sure that 
    //the map contains the objects with right cast. 
    ValueLoader<?> loader = map.get(key); 
    return (ValueLoader<T>) loader; 
} 

}

ответ

3

Существует не чистый путь (как - вы будете нуждаться непроверенной бросок), поскольку map.values() содержит ValueLoader<?>. Тем не менее, по построению карты вы знаете, что бросок безопасен, поэтому можно подавить предупреждение.

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

private <T> void safePut(
    Map<Class<?>, ValueLoader<?>> map, 
    Class<T> clazz, 
    ValueLoader<T> valueLoader) { 
    map.put(clazz, valueLoader); 
} 

который мешает вам писать map.put(Integer.class, new StringValueLoader()); случайно.

Вы могли бы также рассмотреть возможность сделать бросок на локальной переменной, которая позволит вам подавить только на эту переменную, а не весь метод:

@SuppressWarnings("unchecked") 
ValueLoader<T> loader = (ValueLoader<T>) map.get(key); 
return loader; 
+0

Это звучит хорошо. Благодаря! –