Kotlin中无法重写泛型接口内的函数该如何处理?
问题根源
你当前的写法混淆了接口级泛型和方法级泛型的适用场景:
你将P/R/E/D这些泛型声明在了接口的方法内部,相当于约定该接口的所有实现类,对应的post/edit/delete方法必须支持任意类型的请求参数和返回值,你在实现时固定死参数、返回值类型的操作相当于缩小了方法的适用范围,不符合接口的契约要求,所以IDE不会将你的实现识别为接口方法的重写。
解决方案
如果你需要每个实现类对应固定的请求、响应类型,直接把泛型参数提到接口层面声明即可:
// 若post/edit/delete的响应类型一致,可共用同一个R泛型,原有<T>按需保留即可 interface EditRepository<T, P, E, D, R> : Repository { fun post(postRequest: P): LiveData<ResponseData<R>> fun edit(editRequest: E): LiveData<ResponseData<R>> fun delete(deleteRequest: D): LiveData<ResponseData<R>> } // 若三个方法的响应类型不同,拆分多个响应泛型即可 interface EditRepository<T, P, E, D, RPost, REdit, RDelete> : Repository { fun post(postRequest: P): LiveData<ResponseData<RPost>> fun edit(editRequest: E): LiveData<ResponseData<REdit>> fun delete(deleteRequest: D): LiveData<ResponseData<RDelete>> }
实现类直接在声明时指定对应的具体类型即可正常重写:
class CustomEditRepository: EditRepository<Any, CustomPostReq, CustomEditReq, CustomDeleteReq, CustomResp> { override fun post(postRequest: CustomPostReq): LiveData<ResponseData<CustomResp>> { // 实现逻辑 } override fun edit(editRequest: CustomEditReq): LiveData<ResponseData<CustomResp>> { // 实现逻辑 } override fun delete(deleteRequest: CustomDeleteReq): LiveData<ResponseData<CustomResp>> { // 实现逻辑 } }
提示:如果原有接口的
<T>泛型没有实际业务用途,可以直接删除。
内容的提问来源于stack exchange,提问作者Віталій Шимко
相关产品推荐
相关产品推荐

