如何将一个对象转换为另一种对象类型?列表<A>到列表<B>?

时间:2021-04-19 13:29:09

标签: android kotlin

我有两个对象,例如:

@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,然后我插入到数据库中,数据库对象在 PuntiVendita 下,所以我必须将 PuntiVendita 对象传递给我的插入方法。

我正在尝试做类似的事情:

val puntiVendita = response.body()!! as List<PuntiVendita> 但我收到了未经检查的类型警告(未经检查的强制转换:列表到列表),我会在不做任何@Suppress 的情况下阻止它

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

gson.fromJson(gson.toJson(response.body()),object: TypeToken<List<PuntiVendita>>() {}.type )

答案 2 :(得分:0)

你不能,这是不同的类型

你可以尝试类似的东西

fun List<AutoComplete>.convert(): List<PuntiVendita>
{
    return this.map { PuntiVendita(it.cod, it.desc) }
}

fun test()
{
    val listA = listOf<AutoComplete>()
    val listB = listA.convert()
}