java - 将对象强制转换为类的类型安全方法

标签 java casting type-conversion

我想取消对未经检查的转换警告的抑制。如何才能完全放心地将 o 转换为 T

值得注意的是:此代码片段中的 ResultSet 是一个与源无关的专有包装器。它与 java.sql.ResultSet 非常相似,但又不一样。此外,将 Eclipse Mars.1 与 Java 8 u45 一起使用,IDE 和 javac 都会发出警告。我意识到,由于它包含在 if 语句中,因此从技术上来说这不是问题,但我绝对讨厌抑制警告。我觉得必须有一种完全类型安全的方法来执行该转换。

public class ResultSetQuery {
    public static <T> List<T> collectValues(ResultSet rs, String keyName, Class<T> tclass) {

        List<T> result = new LinkedList<>();

        while(rs.next()) {
            Object o = rs.getData(keyName);

            if (tclass.isAssignableFrom(o.getClass())) {

                @SuppressWarnings("unchecked")
                T v = (T)o;

                result.add(v);
            } else {
                result.add(null);
            }
        }

        return result;
    }
}

最佳答案

您不盲目地沉默编译器警告的意图是值得尊敬的,但您的代码示例是合理使用@SupressWarnings的一个很好的例子。您的代码不会失败,但编译器仍然会提示,因此 @SupressWarnings 是正确的选择。

看一下 java.lang.Class#cast ,它与您的示例具有相同的模式。它还会抑制警告:

@SuppressWarnings("unchecked")
public T cast(Object obj) {
    if (obj != null && !isInstance(obj))
        throw new ClassCastException(cannotCastMsg(obj));
    return (T) obj;
}

关于java - 将对象强制转换为类的类型安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34497137/

相关文章:

java - 转换输出文件不存在

c++ - 使用 C++ 样式转换从 Void* 转换为 TYPE*​​ : static_cast or reinterpret_cast

c - 如何将 void* 转换为 int[][3]

c++ - Visual Studio 报告结构 vector 上的 push_back() 函数调用错误

c - 这是将 longs 转换为二进制 (char *) 表示的惯用 C 方法吗?

php - 当类型提示时,像在 JAVA 中一样使用包装类

java - 将 BiPredicate 传递给 Stream 以比较对象列表

java - 尝试运行 org.hibernate.tool.ant.EnversHibernateToolTask​​ 时遇到很多绊脚石

java - 从抽象类继承方法错误

javascript - "too much recursion"在这个用 JavaScript 编写的递归函数中 (obj2str)