Java泛型工厂通过类型注册表、Class信息辅助和Supplier延迟构造实现类型安全创建,规避类型擦除与强转风险,统一接口收口并支持依赖注入。

Java 中泛型在工厂模式里的通用构建,核心是用类型参数替代硬编码的类判断,避免反射强转风险,同时保持编译期类型安全。关键不在“能不能泛型”,而在于“怎么让泛型真正参与创建逻辑”——靠的是类型注册 + 类型擦除规避 + 运行时 Class 信息辅助。
用类型注册表替代 if-else 分支
原始写法中直接 new StringHandler() 并强制返回 Handler
- 声明一个 Map
, Object> 或更安全的 Map , Supplier>>,把 Class 作为键,构造逻辑作为值 - 注册时明确指定:registry.put(String.class, () -> new StringHandler())
- 获取时先按 Class> 查,再强转 Supplier
>,再调用 get() —— 此时 T 已由调用方确定,类型安全由使用者保障
泛型工厂接口统一收口
定义一个泛型抽象工厂,把“创建什么”交给类型参数,“怎么创建”留给实现:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- interface GenericFactory
{ T create(); } - 每个具体工厂实现它:class StringHandlerFactory implements GenericFactory
> { public Handler create() { return new StringHandler(); } } - 上层可用 FactoryRegistry 统一管理:registry.register(String.class, new StringHandlerFactory())
- 调用时:Handler
h = registry.get(String.class).create()
利用 Class 辅助绕过类型擦除限制
虽然 Java 泛型有类型擦除,但 Class 对象保留了运行时类型信息,可用来做精准匹配和实例化:
立即学习“Java免费学习笔记(深入)”;
- 工厂方法签名设为 <T> Handler<T> getHandler(Class<T> type)
- 内部用 type.cast(…),或通过反射调用其无参构造器(需确保 Handler 实现类有 public 无参构造)
- 配合 @SuppressWarnings("unchecked") 是常见且可控的做法,比裸反射更清晰
- 例如:return type == String.class ? (Handler
) new StringHandler() : …
结合 Supplier 和泛型方法实现延迟构造
避免提前实例化、支持依赖注入场景,把构造逻辑封装成 Supplier:
- public class HandlerFactory { private final Map
, Supplier>> handlers = new HashMap(); } - 注册:factory.register(Date.class, () -> new DateHandler(dependencyA, dependencyB))
- 获取:@SuppressWarnings("unchecked") return ((Supplier
>) handlers.get(type)).get() - 这样既解耦了创建时机,又保留了泛型语义和外部类型推导能力

















