You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Віталій Шимко

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 19:39:01