`<T> T execute(...)` 泛型方法 VS `TaskExecutor<T>` 泛型接口对比分析
全网最通俗、最清晰对比T T execute(...)泛型方法 VSTaskExecutorT泛型接口用最简单的人话讲透看完再也不会混淆一、先看两段代码1️⃣泛型方法publicinterfaceTaskExecutor{TTexecute(TaskTtask);}特点接口没有泛型方法自己带泛型T2️⃣泛型接口publicinterfaceTaskExecutorT{Texecute(TaskTtask);}特点接口带泛型方法没有T二、核心区别✅1. 泛型方法一个执行器可以执行所有类型任务T T execute(...)一个执行器 → 万能通用可以同时执行TaskStringTaskIntegerTaskUser任何类型T 是每次调用方法时动态确定的❌2. 泛型接口一个执行器只能执行一种固定类型TaskExecutorT创建时就固定死 T例如TaskExecutorString→ 只能执行 String 任务TaskExecutorInteger→ 只能执行 Integer 任务T 是创建类时确定整个类都用同一个 T三、超级通俗比喻1️⃣ 泛型方法 万能充电器一个充电器能充苹果手机安卓手机耳机充电宝你传什么它就充什么。2️⃣ 泛型接口 专用充电器买的时候就决定只充苹果手机别的都不能用四、代码对比【泛型方法】TaskExecutorexecutornewSyncTaskExecutor();// 同一个执行器可以执行任意类型Stringsexecutor.execute(newPrintTask(test));Integeriexecutor.execute(newNumberTask(100));Useruexecutor.execute(newUserTask(user));【泛型接口】TaskExecutorStringstringExecutornewSyncTaskExecutor();stringExecutor.execute(task);// 只能返回 StringTaskExecutorIntegerintExecutornewSyncTaskExecutor();intExecutor.execute(task);// 只能返回 Integer必须创建多个执行器非常麻烦五、为什么用【泛型方法】因为执行器要做到统一管理能执行任何类型任务返回值类型跟随任务自动变化一个执行器万能通用泛型方法 为执行器模式量身定做泛型接口做不到六、最终总结1.T T execute(...)泛型方法一个执行器 → 支持所有类型任务每次调用方法时T 自动变化2.TaskExecutorT泛型接口一个执行器 → 只能支持一种固定类型创建类时 T 就固定死3. 业务场景执行器必须用泛型方法绝对不要用泛型接口七、泛型方法 vs 泛型接口 核心区别// 1. 泛型方法推荐执行器使用publicinterfaceTaskExecutor{TTexecute(TaskTtask);}接口无泛型方法自带泛型一个执行器可执行任意返回值类型任务类型由方法调用时动态确定适合任务执行器、通用处理器等场景// 2. 泛型接口不适合执行器publicinterfaceTaskExecutorT{Texecute(TaskTtask);}接口定义泛型整个类共用一个 T一个执行器只能处理固定类型任务灵活性差无法统一管理