abstractwrapper采用crtp模式实现类型安全的链式调用:t绑定实体类型,r统一列名表达(string或sfunction),children确保子类方法链式返回不退化。

AbstractWrapper<t r children></t> 的泛型设计不是为了“递归”,而是一种类型安全的链式构造器模式,核心目的是支持 fluent API(如 .eq().ne().like().orderByAsc())无限调用且始终返回正确子类类型。
它用三个泛型参数协同解决三个问题:
-
T:实体类型(如User.class),用于setEntity()和条件与实体字段的语义绑定 -
R:列名类型(通常是String,但 Lambda 版本为SFunction),决定你写的是字段名还是方法引用 -
Children:当前 wrapper 自身的子类类型(如QueryWrapper<user></user>),保证链式调用不丢失具体类型
这叫 CRTP(Curiously Recurring Template Pattern),不是 Java 原生语法意义上的“递归泛型”,而是编译期类型推导技巧。
为什么需要 Children extends AbstractWrapper<...></...>?
因为 AbstractWrapper 里大量方法(如 eq()、gt()、select())都声明返回 Children,而不是 AbstractWrapper。这样:
-
QueryWrapper<user> qw = new QueryWrapper();</user> -
qw.eq("age", 18).like("name", "张").orderByAsc("id");
每一步都仍是QueryWrapper<user></user>类型,IDE 可识别、可续调、不丢上下文。
若直接返回 AbstractWrapper,链式调用后类型就退化成父类,无法继续调用子类特有方法(比如 QueryWrapper 的 select(),或 UpdateWrapper 的 set())。
R 泛型的作用:统一列名表达方式
- 普通 wrapper(如
QueryWrapper<user></user>)中R = String→eq("name", "李四") - Lambda wrapper(如
LambdaQueryWrapper<user></user>)中R = SFunction<user></user>→eq(User::getName, "李四")
AbstractWrapper 抽象出 R,让同一套条件构建逻辑能适配两种风格,底层通过 ColumnUtils.findColumn(R column) 统一解析成数据库字段名。
注意:R 不是通配符 ?,它是明确参与类型推导的形参,不能省略或乱填。常见错误是传错 R 导致泛型擦除后方法不可见。
T 和 Children 的绑定关系
Children 必须是 AbstractWrapper<t r children></t> 的具体子类,例如:
public class QueryWrapper<t> extends AbstractWrapper<t string querywrapper>> { ... }
public class LambdaQueryWrapper<t> extends AbstractWrapper<t sfunction>, LambdaQueryWrapper<t>> { ... }</t></t></t></t></t>
这种写法确保:
-
T限定实体类型,使setEntity()和lambda方法参数类型一致 -
Children锁定返回类型,维持链式调用完整性 - 编译器能校验
new QueryWrapper<user>().eq(...)</user>的eq参数是否匹配User字段(Lambda 版尤其明显)
通配符 ? 在 Wrapper 中通常只出现在工具方法里
比如某些泛型工具类可能写:
public static <t> QueryWrapper<t> createWrapper() {
return new QueryWrapper();
}</t></t>
或者接收任意 wrapper:
public void handleWrapper(AbstractWrapper, ?, ?> wrapper) { ... }
但这属于外部调用场景,AbstractWrapper 自身定义中不使用 ? —— 它依赖精确泛型推导,而非模糊通配。
真正关键的是三元组的闭环定义,不是“用不用通配符”,而是“如何让 T、R、Children 各司其职又相互约束”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











