Java重写泛型方法提示未覆盖抽象方法编译错误排查
报错根因
问题出在Message抽象类的setContent方法上重复声明了独立的方法级泛型参数:
- 类定义
abstract class Message <T>上的<T>是类级别的泛型参数,子类继承时指定Message<String>本来是要把类泛型T绑定为String类型。 - 但原代码里的抽象方法
abstract <T> void setContent(T content),方法返回值前额外加的<T>是完全独立于类泛型的方法级泛型,和类上声明的T没有任何关系,只是恰好和类泛型重名而已。 - 这种情况下你在
TextMessage里写的void setContent(String content)只是定义了一个参数为String的重载方法,并没有重写那个带独立泛型参数的抽象方法,编译器检测到非抽象子类没有实现全部抽象方法,自然抛出编译错误。
如果要重写原错误写法里的方法级泛型setContent,必须写成通用泛型方法的形式,根本没法把参数类型固定为String,完全不符合绑定String类型的设计预期:
// 这才是符合原错误代码抽象方法签名的重写实现,无法固定参数为String @Override <T> void setContent(T content) { }
正确实现方式
删掉setContent方法上多余的方法级泛型声明,让方法直接复用类级别的泛型参数即可,建议重写方法时加上@Override注解,编译器会自动帮你校验重写签名是否正确,提前发现问题:
abstract class Message <T> { // 移除方法前多余的<T>声明,T直接引用类级别的泛型参数 abstract void setContent(T content) ; } class TextMessage extends Message<String> { @Override void setContent(String content) { // 编写具体业务逻辑 } } public class Main { public static void main(String[] args) { System.out.println("Hello World"); } }
内容的提问来源于stack exchange,提问作者Akshay Malik
相关产品推荐
相关产品推荐

