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

Posted

技术标签:

【中文标题】如何将对象数据类型传递给类或函数?【英文标题】:How to pass object data type to class or function? 【发布时间】:2019-01-24 03:40:17 【问题描述】:

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

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】:

问题是type erasure。

在语句TypeToken&lt;MainResp&lt;T&gt;&gt;() 中,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)

【讨论】:

感谢您的出色回应,我已经尝试了您的解决方案,但数据类型“itemMaterial”仍未传递给函数。返回“LinkedTreeMap”数据类型。此外,当我使用 val mainResp = convertRespByType(response) 时。 ItemMaterial 显示警告:此检查报告带有可以安全删除和推断的类型参数的函数调用 @rizkidzulkarnain 您可以检查(通过println 或调试器)datatype 是否正确包含通用ItemMaterial 类型。我用一个更简单的例子验证了这一点,它可以工作。如果变量datatype 包含正确的类型,但仍然无法按预期工作,那么您还有另一个问题。警告是,因为编译器可以推断出泛型函数的正确类型。为了更好地理解,我在答案中指定了类型。您可以安全地删除该类型。 我已经调试了 datatype 变量值,如果我在问题中使用第一个 MainRespMainResp ItemMaterial> 我认为参数仍然没有通过。您是否尝试过这种方法并在您身边工作? 在我的例子中 gist.github.com/rpreissel/b83091dc6fef3610fc989d561be97022 它有效。

以上是关于如何将对象数据类型传递给类或函数?的主要内容,如果未能解决你的问题,请参考以下文章

python 类中的变量传递给类中的函数

如何将库类或对象传递给片段?

为啥 Typescript 允许将“任何”对象类型分配给类对象?

如何将对象类型从业务层传递到数据层

JavaScript高级 面向对象(12)--引用类型值类型作为参数传递的特性

seven day--面向对象及模块