泛型接口是构建跨模块业务校验器的核心,通过定义ValidationRule<T>等契约实现类型安全的可复用校验逻辑,支持字段提取、嵌套校验与模块间基于抽象类型的规则共享。

泛型接口是构建跨模块业务校验器的核心设计手段,它让校验逻辑与具体数据类型解耦,同时保留完整的编译期类型信息。关键不在于“写一个通用校验器”,而在于定义一套可复用、可组合、可静态检查的规则契约。
用泛型接口抽象校验行为
校验器本身不处理业务细节,而是暴露统一的能力契约。例如定义一个泛型接口:
interface ValidationRule<T> {
validate(value: T): boolean;
message(): string;
}
这个接口不绑定任何字段或实体,只承诺对任意类型 T 执行判定并返回提示。不同模块可各自实现:
• 订单模块提供 OrderAmountRule implements ValidationRule<bigdecimal></bigdecimal>
• 用户模块提供 UserNameLengthRule implements ValidationRule<string></string>
• 设备模块提供 DeviceIdFormatRule implements ValidationRule<string></string>
泛型方法支持字段级规则注入
真实校验发生在对象字段上,需通过泛型方法提取字段值并绑定规则。常见模式是使用函数式参数:
<T, F> Validator<T> addRule( Function<T, F> fieldExtractor, ValidationRule<F> rule )
调用时明确类型链路:
• validator.addRule(User::getEmail, new EmailFormatRule())
→ User 是主类型,String 是字段类型,EmailFormatRule 只校验 String
→ 编译器能检查 User::getEmail 是否真返回 String,且 EmailFormatRule 是否适配 String
嵌套校验通过泛型递归传递类型
当字段本身是复杂对象(如 User.address 是 Address 类型),校验需向下穿透。此时用泛型方法接收子类型校验器:
<T, F> Validator<T> addNestedRule( Function<T, F> fieldExtractor, Validator<F> nestedValidator )
例如:
• addNestedRule(User::getAddress, addressValidator)
→ addressValidator 是 Validator<Address> 实例
→ 内部所有规则都针对 Address 字段定义,类型边界清晰,不会误用用户级规则
跨模块共享需约定泛型约束而非具体实现
模块间不共享校验类,只共享泛型接口和类型标识。例如统一定义:
interface BusinessId {
String value();
}
class OrderId implements BusinessId { ... }
class ProductId implements BusinessId { ... }
然后共用一个泛型规则:
• IdFormatRule implements ValidationRule<BusinessId>
各模块传入自己的 OrderId 或 ProductId 实例,规则内部只调用 value(),无需感知具体子类

















