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

如何用单个数据类返回多种Lookup实体类实例?

通用LookupResult实现方案

直接用Kotlin泛型就能实现一次编写、复用所有实体类的需求,完全避免重复代码,比用Any类型更安全(编译期就能检查类型,不会出现运行时类型转换错误)。

1. 定义泛型数据类

创建一个带泛型参数的LookupResult数据类,泛型参数用来指定resultClass的类型:

data class LookupResult<T>(
    val wasSuccessful: Boolean = false,
    val resultClass: T? = null
)

2. 使用示例

针对不同的实体类,直接指定泛型参数即可,无需重复定义新的数据类:

// 返回AssetStatus类型的结果
fun getAssetStatus(id: Long): LookupResult<AssetStatus> {
    // 模拟数据库查询逻辑
    val status = AssetStatus(id, "Active")
    return LookupResult(wasSuccessful = true, resultClass = status)
}

// 返回StockItemStatus类型的结果
fun getStockItemStatus(id: Long): LookupResult<StockItemStatus> {
    val status = StockItemStatus(id, "InStock")
    return LookupResult(wasSuccessful = true, resultClass = status)
}

// 返回NominalCode类型的结果
fun getNominalCode(id: Long): LookupResult<NominalCode> {
    val code = NominalCode(id, "CODE-001")
    return LookupResult(wasSuccessful = true, resultClass = code)
}

3. 可选:添加类型约束(如果需要)

如果所有实体类有共同的父类或接口(比如都继承自BaseLookupEntity),可以给泛型参数加上约束,确保只能传入指定类型的实体:

// 先定义基础父类或接口
open class BaseLookupEntity(
    val id: Long?,
    val name: String
)

// 让所有实体继承该父类
data class AssetStatus(
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "asset_status_id")
    override val id: Long? = null,

    @Column(name = "asset_status_name")
    override val name: String = ""
) : BaseLookupEntity(id, name)

// 然后给LookupResult添加类型约束
data class LookupResult<T : BaseLookupEntity>(
    val wasSuccessful: Boolean = false,
    val resultClass: T? = null
)

这样做的好处是:

  • 保证LookupResult只能接收指定类型的实体,避免误用
  • 可以在LookupResult中安全调用父类的公共方法/属性

内容的提问来源于stack exchange,提问作者JamieRhys

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:21:13