我正在尝试泛化旧代码,并且在某些代码中,给定类似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来为您处理。

07-24 09:49
查看更多