为何包含类型参数<T>的方法重写无法通过编译?
泛型方法重写编译失败的原因解析
先看给出的代码:
class Base { public <T> Collection<String> transform(Collection<String> list) { return null; } } class Derived extends Base { @Override public <T> Collection<String> transform(Collection list) { return null; } }
这段代码编译失败的核心原因如下:
- 父类的
<T>是无意义的泛型参数:父类的transform方法虽然声明了类型参数<T>,但这个参数既没用到方法的参数、返回值里,也没在方法内部使用,属于声明了但未实际发挥作用的泛型参数。 - 子类泛型方法与父类方法签名不匹配:当子类也声明
<T>时,这个<T>是子类方法独立的泛型参数,和父类的<T>没有任何关联。此时Java会把子类的方法认定为一个全新的泛型方法,而非重写父类的方法。再加上子类方法的参数是原始类型Collection(未指定泛型),和父类的Collection<String>参数签名不匹配,@Override注解就会报错——找不到可重写的父类方法。 - 移除
<T>后符合泛型擦除的重写规则:当子类去掉<T>后,方法不再是泛型方法。此时Java会按照泛型擦除后的规则检查重写:父类方法泛型擦除后的签名是Collection transform(Collection list),子类方法的签名和这个完全一致,且返回值Collection<String>和父类的返回值兼容,因此符合重写要求,能正常编译。
内容的提问来源于stack exchange,提问作者Oyst
相关产品推荐
相关产品推荐

