Groovy中子类方法无法覆盖父类泛型方法的原因排查
为什么你的Groovy子类方法无法覆盖父类的泛型方法?
这个问题的核心出在泛型的类型擦除机制以及父类泛型参数的定义方式上,我给你拆解清楚:
可能的原因分析
1. 父类泛型是方法级别的,而非类级别的
如果你的父类中,fromEntity是一个方法自身声明的泛型方法(比如写法是这样的):
public class BaseMapper { // 方法自己声明了<T, E>泛型参数 protected <T, E> T fromEntity(E entity) { return entity; } }
这种情况下,Java/Groovy的泛型擦除机制会把这个方法编译成protected Object fromEntity(Object entity)。而你子类中写的protected FactorInfo fromEntity(Factor f),签名和擦除后的父类方法完全不匹配——这其实是在重载一个新方法,不是覆盖父类的方法,所以IDE会提示无法覆盖。
2. 父类是泛型类,但子类继承时未绑定具体泛型参数
如果父类是类级别的泛型类(比如写法是这样的):
public abstract class BaseMapper<T, E> { protected T fromEntity(E entity) { return entity; } }
但你的子类继承时没有明确指定父类的泛型参数(比如只写了class FactorMapper extends BaseMapper),编译器会把父类的泛型参数默认擦除为Object,此时父类方法的签名还是protected Object fromEntity(Object entity),子类的方法签名依然不匹配,自然无法被识别为覆盖。
解决方法
针对类级泛型的正确写法(推荐)
如果父类是泛型类,子类继承时一定要明确绑定对应的泛型参数,这样编译器就能识别出你要覆盖的是具体化后的父类方法:
// 继承时指定父类的泛型参数:T=FactorInfo,E=Factor class FactorMapper extends BaseMapper<FactorInfo, Factor> { @Override protected FactorInfo fromEntity(Factor f) { // 在这里处理Factor转FactorInfo的逻辑 return new FactorInfo() } }
针对方法级泛型的替代方案(不推荐)
如果父类必须用方法级泛型,那你没法直接用具体类型覆盖,只能保留泛型参数并做类型检查,但这种写法不够优雅:
class FactorMapper extends BaseMapper { @Override protected <FactorInfo, Factor> FactorInfo fromEntity(Factor f) { if (f instanceof Factor) { return new FactorInfo() } throw new IllegalArgumentException("Invalid entity type") } }
显然这种方式不如类级泛型清晰,所以优先推荐第一种方案。
内容的提问来源于stack exchange,提问作者MoRtEzA TM
相关产品推荐
相关产品推荐

