我想取消对未经检查的转换警告的抑制。如何才能完全放心地将 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/