Java泛型接口实现提示Method does not override错误怎么解决?
Java泛型接口方法重写报错问题分析
你的写法核心问题是泛型的声明位置不符合重写规则,具体原因和解决方法如下:
问题根因
- 你在接口中定义的
<T, R> T create(final R req)属于方法级泛型,泛型参数<T>、<R>是归属于方法本身的,含义是:该方法的具体类型由调用方在调用时动态指定,实现类必须兼容所有合法的T、R类型,不能自行固定参数和返回值类型。 - 你在实现类中直接把返回值固定为
CustomerResponseObject、参数固定为CustomObject,相当于人为缩小了方法的适用范围,完全不符合方法重写的要求,因此编译器会抛出Method does not override method from its superclass错误。
解决方法
你的需求是封装通用服务接口,每个业务实现类对应固定的请求、返回类型,应该把泛型声明到接口级别而非方法级别:
1. 修改通用接口定义
@Service // 泛型声明到接口上,T为当前业务统一返回值类型,R为当前业务统一请求参数类型 public interface CustomInterface<T, R> { List<T> get(final R req); T getById(final String id); T create(final R req); T update(final String id, final R req); T patch(final String id, final R req); T delete(final String id); }
2. 修改实现类写法
实现类直接指定对应业务的泛型具体类型即可正常重写方法:
// 明确当前实现类对应的返回类型为CustomerResponseObject,请求参数类型为CustomObject public class CustomImpl implements CustomInterface<CustomerResponseObject, CustomObject> { ///// This is the implementation of one of the methods! @Override public CustomerResponseObject create(final CustomObject req) { return null; } // 其余方法会自动匹配泛型类型,不需要额外处理 }
内容的提问来源于stack exchange,提问作者WilssoN93
相关产品推荐
相关产品推荐

