Как передать тип данных объекта в класс или функцию? - PullRequest
0 голосов
/ 24 января 2019

Результат этого кода - то, что я хочу:

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 голосов
/ 24 января 2019

Проблема в типе стирания .

В операторе 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...