【发布时间】:2016-04-02 12:23:27
【问题描述】:
我想取消对未经检查的转换警告的抑制。我怎样才能完全保证将o 转换为T?
注意:此 sn-p 中的 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;
}
}
【问题讨论】:
-
你为什么要打扰?测试
isAssignableFrom确保强制转换不会失败,因此理论上编译器可能足够聪明,不会发出警告,但无论如何抑制警告是安全的。 -
ResultSet 是来自
java.sql包吗?我在官方文档中没有找到getData方法。 -
while (rs.next())可以抛出SQLException,因此您需要在方法中声明throws SQLException,或者用while代码包围try-catch。 ---rs.getData(keyName)是java.sql.ResultSet,对吧?验证.getData(String)方法是否存在;因为看起来没有。也许您的意思是 getDate? -
@wero 我不知道其他编译器,但是 NetBeans (8) 使用的 JDK, 足够聪明,不会发出一个警告。 =)
-
@AlmightyR 很有趣。我尝试使用 JDK 8 中的
javac,但它会抱怨。 NetBean 不使用javac?。
标签: java casting type-conversion