如何在父类中定义始终指向子类的泛型类型?
解决方案:用自限定泛型实现父类指向子类类型
当然可以实现!这在Java里典型的解决方式就是用自限定泛型(self-bounded generics),刚好能满足你想要父类方法返回子类类型的需求。
第一步:修改抽象父类,引入自限定泛型
给父类添加一个泛型参数,并通过约束让它绑定到子类本身:
public abstract class MySuperclass<T extends MySuperclass<T>> { public abstract T getInstance(); }
这里的T extends MySuperclass<T>是核心逻辑:它要求泛型参数T必须是MySuperclass的子类,同时这个子类必须把自己作为泛型参数传递给父类。这样父类的getInstance()方法就可以直接返回T类型——也就是你想要的子类类型。
第二步:子类实现时指定自身为泛型参数
创建子类的时候,把自己作为泛型参数传给父类,然后重写getInstance()方法时就能直接返回当前子类的类型:
public class FirstSubclass extends MySuperclass<FirstSubclass> { @Override public FirstSubclass getInstance() { return new FirstSubclass(); // 这里可以替换成你需要的实例化逻辑 } }
验证通用性
再创建另一个子类试试,同样的逻辑完全适用:
public class SecondSubclass extends MySuperclass<SecondSubclass> { @Override public SecondSubclass getInstance() { return new SecondSubclass(); } }
使用效果
当你使用父类引用指向子类实例时,调用getInstance()不需要强制转换就能直接得到子类类型,完全符合你的需求:
MySuperclass<FirstSubclass> obj = new FirstSubclass(); FirstSubclass instance = obj.getInstance(); // 无编译警告,直接获取子类类型
内容的提问来源于stack exchange,提问作者Basti
相关产品推荐
相关产品推荐

