java泛型虽因类型擦除不支持运行时多态,但通过泛型接口(如basedao)、泛型方法(如maptoentity)、框架原生泛型支持(mybatis)及显式class传递,可全程保障类型安全,彻底消除dao层冗余强制转换。

Java泛型本身不提供运行时多态性(因类型擦除),但结合泛型方法、泛型类与合理设计,能从编译期就杜绝数据库操作中大量冗余的强制类型转换——关键不是“用泛型模拟多态”,而是让类型信息在调用链中全程可推导、可验证。
用泛型DAO接口统一返回类型
避免传统DAO返回Object或Map
- 定义
public interface BaseDao<t> { T findById(Long id); List<t> findAll(); }</t></t> - 实现类如
UserDao implements BaseDao<user></user>,所有方法天然返回User,无需(User) obj - JDBC模板中,通过
RowMapper<t></t>传入Class<t></t>,配合泛型方法解析结果集,类型由调用方明确指定
泛型JDBC工具方法封装结果映射
把ResultSet到对象的转换逻辑收口为泛型方法,消除每处手动转型:
- 写一个
<t> T mapToEntity(ResultSet rs, Class<t> clazz)</t></t>方法,内部用反射+字段匹配完成赋值 - 调用时直接写
User user = jdbcUtil.mapToEntity(rs, User.class);—— 返回即目标类型,零强转 - 若用MyBatis,启用
@Select("...") List<order> selectOrders();</order>,框架自动完成泛型化映射,不再依赖resultType="java.util.Map"后手拆
用泛型Repository替代原始SQL拼接
绕过字符串SQL + Object[]参数的脆弱组合,转向类型安全的查询构建:
- 设计
QuerySpec<t></t>类封装条件,如QuerySpec<product>.where("price", GREATER_THAN, 100)</product> - 执行方法声明为
<t> List<t> execute(QuerySpec<t> spec)</t></t></t>,返回类型与spec中T一致 - 底层SQL生成和参数绑定由工具自动处理,开发者不接触Object数组或ResultSet,自然规避转型风险
避免泛型擦除导致的运行时类型丢失
当必须依赖反射(如通用分页、动态表名)时,显式传递Class<t></t>而非仅靠泛型占位符:
- 错误写法:
public <t> List<t> queryBySql(String sql)</t></t>→ 运行时T已擦除,无法反序列化 - 正确写法:
public <t> List<t> queryBySql(String sql, Class<t> targetType)</t></t></t>,用targetType驱动Gson/BeanUtils等工具 - 搭配泛型方法签名,既保持调用简洁(
dao.queryBySql("...", User.class)),又确保类型信息落地
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











