泛型多态问题:如何实现返回不同子类对象的函数及调用?
解决方案
你的泛型方法已经具备返回任意A子类对象的能力,问题出在调用时的类型接收方式上,以下是几种正确的调用姿势:
1. 显式指定泛型类型,用具体子类接收
直接在调用时明确泛型参数为B或D,同时用对应子类类型的变量接收返回值,这样就能直接调用子类专属方法:
// 获取B类型对象并调用其方法 B bInstance = this.<B>getFunction(IntegrationType.TYPE_B); bInstance.b专属方法(); // 获取D类型对象并调用其方法 D dInstance = this.<D>getFunction(IntegrationType.TYPE_D); dInstance.d专属方法();
2. 利用编译器类型推断,省略泛型显式声明
只要接收变量的类型明确是B或D,编译器会自动推断泛型参数T的类型,写法更简洁:
B bInstance = getFunction(IntegrationType.TYPE_B); bInstance.b专属方法(); D dInstance = getFunction(IntegrationType.TYPE_D); dInstance.d专属方法();
3. 若必须用父类A接收,需先类型判断再向下转型
如果业务场景下只能用A类型变量接收,后续要调用子类方法时,必须先通过instanceof判断实际类型,再强制转型:
A aInstance = getFunction(IntegrationType.TYPE_B); if (aInstance instanceof B) { B bInstance = (B) aInstance; bInstance.b专属方法(); }
优化建议:给泛型加约束提升安全性
原方法的泛型<T>没有约束,可能导致错误的类型转换,建议把泛型约束为A的子类,同时增加类型校验避免运行时异常:
public <T extends A> T getFunction(IntegrationType integrationType) { A instance = integrationFactory.createIntegration(integrationType); // 校验实际对象类型是否匹配目标泛型类型 if (!(instance instanceof T)) { throw new IllegalArgumentException("当前集成类型返回的对象与目标类型不匹配"); } return (T) instance; }
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

