我想删除未经检查的转化警告的抑制。如何完全保证将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;
}
}
答案 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。