我正在尝试泛化旧代码,并且在某些代码中,给定类似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
是可以的,因此很讨厌。当然,我们总是可以显式地强制转换为Class<T>
。问题是,此转换是否安全,因此我可以轻松添加@SuppressWarnings("unchecked")
注释吗? 最佳答案
@SuppressWarnings("unchecked")
在这里应该没问题:我们知道每个包装器类W
都将其TYPE
字段声明为Class<W>
,-可能只需添加注释以解释该合理性。
请注意,如果您正在使用Guava,它已经具有Primitives.unwrap
来为您处理。