如何使Manager类的builder方法返回类型泛型化?附代码示例
泛型化Manager类的Builder方法方案
嘿,我来帮你把这个Builder的返回类型泛型化,这样你的Manager类(以及它的子类)的builder方法能更灵活地支持链式调用和子类扩展,同时保证类型安全。
首先,先看修改后的完整代码(我假设你的Employee类的Builder是标准的递归泛型实现,毕竟你的Manager.Builder继承了它):
// 基础Employee类(如果你的已有类似实现,可以忽略这段) public abstract class Employee<T extends Employee<T>> { protected Employee() {} public abstract static class Builder<T extends Employee<T>, B extends Builder<T, B>> { protected abstract B self(); public abstract T build(); } } // 泛型化后的Manager类 public class Manager<T extends Manager<T>> extends Employee<T> { protected Manager() {} // 泛型化的builder方法,支持返回子类的Builder类型 @SuppressWarnings("unchecked") public static <T extends Manager<T>, B extends Builder<T, B>> B builder() { return (B) new ManagerBuilder(); } public abstract static class Builder<T extends Manager<T>, B extends Builder<T, B>> extends Employee.Builder<T, B> {} public static class ManagerBuilder extends Builder<Manager<Manager>, ManagerBuilder> { @Override protected ManagerBuilder self() { return this; } @Override public Manager<Manager> build() { return new Manager<>(); } } }
接下来我拆解一下关键的修改点:
- 递归泛型绑定:给
Manager类加上T extends Manager<T>的泛型约束,这是递归泛型的经典用法,目的是让子类可以指定自己的类型,保证后续Builder链式调用能返回正确的子类类型,而不是父类。 - 泛型化的builder()方法:把原来固定返回
Manager.Builder的方法改成泛型方法<T extends Manager<T>, B extends Builder<T, B>> B builder(),这样它可以适配任何Manager子类的Builder类型,子类只需要重写这个方法返回自己的Builder即可。 - 安全的类型转换:这里用
@SuppressWarnings("unchecked")抑制了类型转换警告,因为我们明确知道ManagerBuilder是Builder<Manager<Manager>, ManagerBuilder>的实例,这个转换是完全安全的。
子类扩展示例
如果后续你需要实现SeniorManager这样的子类,泛型化的Builder可以完美支持:
public class SeniorManager extends Manager<SeniorManager> { protected SeniorManager() {} // 重写builder方法,返回子类自己的Builder public static SeniorManagerBuilder builder() { return new SeniorManagerBuilder(); } public static class SeniorManagerBuilder extends Builder<SeniorManager, SeniorManagerBuilder> { @Override protected SeniorManagerBuilder self() { return this; } @Override public SeniorManager build() { return new SeniorManager(); } } }
这样调用SeniorManager.builder()会返回SeniorManagerBuilder,链式调用后build()会返回SeniorManager实例,完全符合类型安全的要求,不会出现父类类型强制转换的问题。
内容的提问来源于stack exchange,提问作者ken
相关产品推荐
相关产品推荐

