Apache Commons 详细说明Dbutils泛型及类型擦除问题
使用Apache Commons 在Dbutils操作数据库时,如何有效地包装泛型方法非常重要。本文将分析两种不同的泛型方法,并解释为什么其中一种方法会导致“unchecked cast”警告。
问题源于两种泛型方法在使用QueryRunner查询数据库时的差异:
方法一:直接接收Classs
public <T> T queryOne(Class<T> clazz, String sql, Object... params) throws SQLException { try { return queryRunner.query(connection, sql, new BeanHandler<>(clazz), params); } finally { // 省略代码... } }
方法二:接收泛型T的对象作为参数:
public <T> T queryOne(T t, String sql, Object... params) throws SQLException { try { return queryRunner.query(connection, sql, new BeanHandler<T>((Class<? extends T>) t.getClass()), params); } finally { // 省略代码... } }
方法二在 (Class extends T>) t.getClass() 处产生“unchecked cast“警告。这是因为Java的类型擦除机制:编译后的字节码不包含泛信息。方法1中,Class
方法2强制转换类型 (Class extends T>) t.getClass() 存在类型安全风险。如果在运行过程中引入,则存在类型安全风险。 t 对象的实际类型不是 T 抛出子类 ClassCastException。
为了消除警告,可以在方法二上添加 @SuppressWarnings("unchecked") 注意。但这只能抑制警告,不能消除潜在操作中的异常。该方法总是被直接接受 Class
以上就是Commons Dbutils泛型方法:如何避免类型擦除引起的Unchecked? cast警告?详情请关注图灵教育其他相关文章!
