工作流引擎中用泛型约束任务节点参数类型,核心是将节点行为契约(tasknode)、上下文能力(c extends workflowcontext & transactional & loggable)、跨节点转换(convert)、只读集合(list

在工作流引擎中用泛型约束任务节点参数类型,核心是把“节点行为契约”和“数据流转规则”提前固化到编译期,避免运行时类型错配或强制转型。这不是给每个节点套个 T 就完事,而是围绕任务执行、输入输出、上下文传递三个关键环节做分层约束。
用泛型接口统一节点行为契约
定义一个泛型任务接口,把类型参数绑定到输入(I)和输出(O),让每个具体节点实现时必须明确自己处理什么、产出什么:
interface TaskNode<i o> { O execute(I input, WorkflowContext context); }</i>- 比如审批节点:
class ApprovalNode implements TaskNode<leaverequest approvalresult></leaverequest>,编译器会强制execute()接收LeaveRequest、返回ApprovalResult - 不写泛型或用原始类型,就可能传入
String却期望返回Map,错误只能到运行时暴露
用有界类型参数限定上下文能力
工作流上下文常需支持日志、重试、事务等通用能力。通过 extends 约束上下文类型,确保所有节点都能安全调用这些方法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
<i o c extends workflowcontext transactional loggable> O runNode(TaskNode<i o> node, I input, C context)</i></i>- 这里
C必须同时实现Transactional和Loggable,节点内就能直接调用context.commit()或context.log("start") - 第一个边界必须是类(如
WorkflowContext),后续只能是接口,这是 Java 泛型语法硬性要求
用方法级泛型控制跨节点数据转换
不同节点间数据格式常不一致(如 HTTP 响应 → JSON → 领域对象)。在流转方法上声明独立类型参数,并约束其可转换性:
-
<t extends serializable> T transform(Object raw, Class<t> targetType)</t></t>—— 要求目标类型可序列化,适配缓存或远程传输场景 -
<s d> D convert(S source, Converter<s d> converter)</s></s>—— 把转换逻辑外置为函数式接口,类型由调用方推断,比如convert(jsonStr, JsonConverter::toUser)中S是String,D是User - 避免在节点内部写
(User) obj这种危险强转,把类型安全责任交给泛型契约
用通配符放宽只读集合的接收范围
当节点只需读取前置节点输出的列表(如校验规则集合),但不修改它,用 ? extends 提升兼容性:
void validate(List extends ValidationRule> rules, Object data)- 这样既能接收
ArrayList<emailrule></emailrule>,也能接收LinkedList<phonerule></phonerule>,只要它们都继承ValidationRule - 但方法体内不能往
rules里add新元素——编译器不知道具体子类型,这反而防止了意外污染原始数据流
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










