在return语句中对未选中的强制转换进行警告

时间:2016-03-09 17:52:47

标签: java generics

我有一个类,它包含一组处理T类型值的Valueloader。 这就是我创建类的方法。但是,此类会在第39行return (ValueLoader<T>) loader;

上对未选中的强制转换生成警告

我想知道是否有办法清除此警告。这是我的代码。

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;
}

}

1 个答案:

答案 0 :(得分: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;