如何将泛型类型数据传递给采用泛型类型的函数

时间:2018-04-20 22:12:10

标签: generics kotlin

here

中解决了一个问题
interface IRemoteData<T> {
    fun getJsonPOJO() : T?
}

class RemoteData<T>(response: Response<ResponseBody>, pojoClassType: Class<T>) : IRemoteData<T> {

    private var mData: T? = null
    override fun getJsonPOJO(): T? {
        return mData
    }
}

现在创建了一个RemoteData实例

val remoteData = RemoteData(response, POJOClazz::class.java)

将此remoteData传递给采用泛型类型的函数时会出现另一个错误

handler.onRemoteDataReady(remoteData)
//<===  got Type mismatch: inferred type is RemoteData<out Class<T>> but IRemoteData<T>? was expected

在d:T?

的界面中定义函数
interface IHandler<T> {   
    fun onRemoteDataReady(data :T?)
}

处理程序实例:

class ResponseHandler(val action: Action) : BaseHandler(action), IHandler<IRemoteData> {
    init {
        mAction?.preAction(this)
    }
    override fun onRemoteDataReady(data: IRemoteData?) {
        val responseRecieved = data?.getJsonPOJO()
        .......
   }
}

1 个答案:

答案 0 :(得分:1)

如评论中所述,接口IRemoteData需要通用类型。

以下是工作示例:

interface IHandler<T> {
    fun onRemoteDataReady(data :T?)
}

class ResponseHandler<T>(val action: Action) : BaseHandler(action), IHandler<IRemoteData<T>> {

    override fun onRemoteDataReady(data: IRemoteData<T>?) {
        val responseReceived = data?.getJsonPOJO()
    }
}

它的用法:

val remoteData = RemoteData(response, POJOClazz::class.java)
val handler = ResponseHandler<POJOClazz::class.java>(action)
handler.onRemoteDataReady(remoteData)

请记住,在上一个答案中,您的界面IRemoteData需要一种类型。因此,当您声明ResponseHandler类时,您还需要指定类型。 ResponseHandler<String>将实施IRemoteData<String>

相关问题