列表可以在 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
成功吗?
另请注意 campaignId
和 Campain
字段名称在 RewardDetail
和 Reward
中不同,并且某些字段在 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 中没有值的属性提供默认值。
我是 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
成功吗?
另请注意 campaignId
和 Campain
字段名称在 RewardDetail
和 Reward
中不同,并且某些字段在 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 中没有值的属性提供默认值。