2012-11-18 83 views
1

我试图generify旧代码,并有一些代码,其中给予类似Integer.class,它返回Integer.TYPE(反之亦然),等等其余的包装(如果输入不是包装,它返回输入类)。这似乎是转换的候选人(如果它不存在的话)。所以,我有这样的事情:泛型和类转换

public static <T> Class<T> convert(Class<T> type) { 
    if (type == Integer.class) return Integer.TYPE; 
    // and so on 
    return type; 
} 

这段代码的问题是,编译器不会,本身知道,在if块,我们已确定T == Integer,因此不知道返回Integer.TYPE是的,因此barfing。当然,我们总是可以明确地投到Class<T>。问题是,这个投射是否安全,因此我可以很舒服地添加@SuppressWarnings("unchecked")注解?

回答

0

@SuppressWarnings("unchecked")应该罚款这里:我们知道每个包装类W声明其TYPE字段作为Class<W>, - 可能只是添加注释解释说理性。

请注意,Guava已经有Primitives.unwrap为您处理,以防您使用它。

+0

如问题中所述,如果'type'不代表原始类型或其包装器,则返回输入。还是安全的吧? –

+0

是的 - 抱歉,没有仔细阅读。实际上,链接的番石榴法似乎具有相同的行为。 –