将对象强制转换为类

时间:2015-12-28 16:32:25

标签: 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;
    }
}

2 个答案:

答案 0 :(得分:2)

您不打算盲目地压制编译器警告的意图是值得尊重的,但您的代码示例是合理使用@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;
}

答案 1 :(得分:2)

你可以写:

            if (tclass.isAssignableFrom(o.getClass())) {
                result.add(tclass.cast(o));
            }

(见https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#cast(java.lang.Object)。)

编辑添加:顺便提一句,正如erickson在评论中指出的那样,您应该写tclass.isInstance(o)而不是tclass.isAssignableFrom(o.getClass()):它更简单,更清晰,并且避免了o为空时的NullPointerException。