列表可以在 Kotlin 中正确转换吗?

Can list cast correctly in Kotlin?

我是 Kotlin 新手,


data class RewardDetail(
    val name: String
    val isActivated: Boolean
    val amountInCents: Int?
    val Campain: String?
    val expirationDate: Long?

)

class Rewards(Array<Reward>)

class Reward(
    val name: String
    
    isActive: Boolean
    
    amountInCents: Int
    campaignId: String
    expirationDate: LocalDateTime
)


val details : List<RewardDetail> = blablabla
val rewards = Rewards(details)

可以details转换成rewards成功吗?

另请注意 campaignIdCampain 字段名称在 RewardDetailReward 中不同,并且某些字段在 RewardsDetail[=18= 中可以为空]

处理这种情况的最佳方法是什么?

Kotlin 是 strongly-typed。你永远无法成功地将一件事转化为另一件事 class。您只能将对象转换为它已经满足的类型。例如,如果你有一个 Int,目前编译器只知道它是一个 Number,你可以转换为 Int 来告诉编译器它有一个 Int,这样编译器将允许你使用特定于诠释。但是只有 Int 才能转换为 Int。

因此,与弱类型语言不同,转换不会从一种类型转换为另一种类型。转换只是你向编译器承诺一个对象已经是另一种类型。

在您的示例中,从 Reward 获取 RewardDetail 的唯一方法是编写一个函数,手动将每个 属性 转换为适当的类型。

上面的奖励 class 在很大程度上是多余的。除非您需要对添加到列表或从列表中检索的项目进行验证,否则不需要围绕单个数组或列表的包装器 class。在那种情况下,为此目的创建 ArrayList 的子 class 可能更有意义,因此您仍然可以轻松地迭代列表并在其上使用所有 List 和 Iterable 辅助函数。

大约 95% 的情况下,您应该更喜欢使用 List 而不是 Array。仅当您需要固定大小且可变的集合时,或者如果您正在使用高度 performance-critical 的代码,才应使用数组。它应该仅限于这些用途的原因是,为了稳健性,应尽可能避免可变性,并且数组比 MutableLists 使用起来更麻烦。

从一种类型转换为另一种类型的函数的典型实现是编写扩展函数 RewardDetail.toReward() 扩展函数,或 RewardDetail class 中的 toReward() 函数。但是,在您的情况下,您需要决定当 RewardDetail 的某些值为空时需要发生什么。也许你只是 return null 所以你的转换函数应该是 toRewardOrNull(),或者你为 RewardDetail 中没有值的属性提供默认值。