【问题标题】:Unable to implement Generic interface function in kotlin无法在kotlin中实现通用接口函数
【发布时间】:2021-10-10 04:33:09
【问题描述】:

我已经创建了将域与数据层分开的接口。

interface EditRepository<T> : Repository {    
    fun <P, R> post(postRequest: P): LiveData<ResponseData<R>>
    fun <E, R> edit(editRequest: E): LiveData<ResponseData<R>>
    fun <D, R> delete(deleteRequest: D): LiveData<ResponseData<R>>
}

每个函数都应该有它自己的泛型类型(请求和响应) 在我尝试实现这个接口方法之后,我用我自己的类型替换了泛型类型,并且似乎它们不起作用,因为它无法在新覆盖函数的尖括号内导入我的类型(在屏幕截图下方指出)。而且我不知道我在这里做错了什么。为什么我不能覆盖泛型接口函数?

如果我尝试手动导入我的类型,它会拒绝接受我的函数作为覆盖

【问题讨论】:

    标签: android function kotlin generics interface


    【解决方案1】:

    您不能更改覆盖函数级泛型的类型。作为解决方法,您可以进行类转换

    override fun <P, R> post(postRequest: Response<P>): LiveData<Response<R>> = liveData(IO){
        ........
        emit(ResponseData.SuccessResponse(...) as ResponseData<R>)
    }
    

    但您会收到 lint 警告未经检查的演员:

    另一方面,您可以使用类型级泛型

    interface EditRepository<D,E,P,R> : Repository {
        fun post(postRequest: P): LiveData<ResponseData<R>>
        fun edit(editRequest: E): LiveData<ResponseData<R>>
        fun delete(deleteRequest: D): LiveData<ResponseData<R>>
    }
    

    并指定所需的类型。但是使用 Retrofit 类型级泛型会导致 IllegalArgumentException: Type parameters are unsupported

    【讨论】:

    • 当您需要重复使用相同的方法两次时,这会变得有点笨拙。例如编辑评论、编辑子评论会有不同的类型、响应、逻辑等
    • @ВіталійШимко 是的。使用带有接口的泛型有点笨拙
    猜你喜欢
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2018-06-25
    相关资源
    最近更新 更多