【问题标题】:How to cast one object to another object type? List<A> to List<B>?如何将一个对象转换为另一种对象类型?列表<A> 到列表<B>?
【发布时间】:2021-04-20 21:37:51
【问题描述】:

我有两个对象,例如:

@Entity(tableName = "punti_vendita")
class PuntiVendita(
    @PrimaryKey(autoGenerate = false)
    var cod: String,
    var desc: String
)

data class AutoComplete(
    var cod: String,
    var desc: String
)

Kotlin 中有没有办法将第一个对象合并到第二个对象中?

我的 api 返回 AutoComplete,然后我将其插入 DB,DB 对象位于 PuntiVendita 下,因此我必须将 PuntiVendita 对象传递给我的插入方法。

我试图做类似的事情:

val puntiVendita = response.body()!! as List&lt;PuntiVendita&gt; 但我收到未经检查的类型警告(未经检查的演员表:列表到列表),我会在不做任何@Suppress 的情况下阻止它

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    您的两个类彼此之间没有联系 - 它们碰巧有两个具有相同名称的相同类型的字段,但这是一种“巧合”,就类型系统知道。

    当你投射它们时,你是在说“嘿,顺便说一下,我知道这个列表它包含 AutoComplete 对象,但你可以将它们视为 PuntiVenditas - 相信我。”

    类型系统无法确认,无法检查并验证您是否在做正确的事情,所以它会向您发出警告 - 这里有一个未经检查的演员表!并且即使它有效,如果您(或 API)曾经更改其中一个类,因此您无法将它们视为相同,类型系统也无法警告您。所以它现在警告你,这很危险!

    如果您无法让 API 直接生成 PuntiVendita 对象,可能最安全的做法是创建一个函数,该函数接受一个对象,并生成具有相同值的另一个对象。如果您在代码中执行此操作(而不是序列化为 JSON 并返回到另一种类型),您将获得类型检查和代码验证以及所有这些好东西的好处。此外,您还可以控制包括哪些属性,或在必要时转换它们的名称

    【讨论】:

      【解决方案2】:

      你可以使用 Gson 来做到这一点

      gson.fromJson(gson.toJson(response.body()),object: TypeToken&lt;List&lt;PuntiVendita&gt;&gt;() {}.type )

      【讨论】:

        【解决方案3】:

        你不能,这是不同的类型

        你可以试试

        fun List<AutoComplete>.convert(): List<PuntiVendita>
        {
            return this.map { PuntiVendita(it.cod, it.desc) }
        }
        
        fun test()
        {
            val listA = listOf<AutoComplete>()
            val listB = listA.convert()
        }
        

        【讨论】:

          猜你喜欢
          • 2013-08-14
          • 1970-01-01
          • 1970-01-01
          • 2015-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-01
          相关资源
          最近更新 更多