如何将两个不同Kotlin数据类合并到列表并按time排序及类型识别
解决方案
要实现你的需求,核心是让Event和Task共享一个包含time属性的公共类型,这样既能让编译器识别排序时的time字段,又能保留类型信息用于后续的类型判断。具体步骤如下:
1. 定义公共接口
创建一个包含time属性的接口,让两个数据类都实现它:
interface TimeStamped { var time: String }
2. 修改数据类实现接口
更新Event和Task,让它们实现TimeStamped接口并覆盖time字段:
data class Event( var data: String, override var time: String, var place: String, var event: String ) : TimeStamped data class Task( var data: String, override var time: String, var name: String, var points: List<String>, var checkBoxes: List<Boolean> ) : TimeStamped
3. 合并列表并排序、处理
现在你可以直接按照期望的代码逻辑实现,因为events + tasks会自动推断为List<TimeStamped>类型,编译器能识别it.time,且后续遍历可以通过is关键字判断具体类型:
// 假设events是List<Event>,tasks是List<Task> val newList = (events + tasks).sortedBy { it.time } for (item in newList) { when (item) { is Event -> createNewEvent(item) is Task -> createNewTask(item) } }
补充说明
- 接口
TimeStamped仅作为类型标记和属性约束,不会增加额外开销 - 如果
time字段不需要被修改,接口中可以用val time: String,数据类中对应改为val time: String即可 - 这种方式保留了Kotlin的类型安全,避免了类型转换的风险
内容的提问来源于stack exchange,提问作者tumannick
相关产品推荐
相关产品推荐

