如何将对象数据类型传递给类或函数?

时间:2019-01-24 03:40:17

标签: android kotlin

这段代码的结果就是我想要的:

override fun onResponse(call:Call<MainResp<ItemMaterial>>,response:Response<MainResp<ItemMaterial>>){
    val arawjson: String = Gson().toJson(response.body())
    val dataType = object : TypeToken<MainResp<ItemMaterial>>() {}.type
    val mainResp: MainResp<ItemMaterial> = Gson().fromJson<MainResp<ItemMaterial>>(arawjson, dataType)
 ........

}

但是当我将其简化为简单的类时,便可以使用对象数据类型参数访问每个函数。

class Convert<T>{
    //fungsi umum untuk konversi gson sesuai dengan output datatype sebagai parameter yakni T
    fun convertRespByType(response: Response<MainResp<T>>): MainResp<T> {
        val arawjson: String = Gson().toJson(response.body())

        val dataType = object : TypeToken<MainResp<T>>() {}.type
        val mainResp: MainResp<T> = Gson().fromJson<MainResp<T>>(arawjson, dataType)
        return mainResp
    }
}

并命名为:

override fun onResponse(call:Call<MainResp<ItemMaterial>>,response:Response<MainResp<ItemMaterial>>){
        val aconvert : Convert <ItemMaterial> = Convert()
        val mainResp : MainResp<ItemMaterial> = aconvert.convertRespByType(response)
     ........

    }

但是我在课堂上打电话给的第二个结果与第一个不同? 我认为参数没有传递给类。你能给我推荐吗?

谢谢

1 个答案:

答案 0 :(得分:0)

问题是type erasure

在语句TypeToken<MainResp<T>>()中,类型T在运行时不可用。

在Kotlin中,您可以使用inline reified解决您的问题。 Reified只适用于函数,不适用于类:

inline fun <reified T> convertRespByType(response: Response<MainResp<T>>): MainResp<T> {
    val arawjson: String = Gson().toJson(response.body())

    val dataType = object : TypeToken<MainResp<T>>() {}.type
    val mainResp: MainResp<T> = Gson().fromJson<MainResp<T>>(arawjson, dataType)
    return mainResp
} 

用法:

val mainResp = convertRespByType<ItemMaterial>(response)