You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将两个不同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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:12:49