首页 > 解决方案 > Kotlin - 数据类类型字符串或一些对象

问题描述

假设我在 Kotlin 中有这个数据类:

@Document(collection = Approval.COLLECTION)
data class Approval(
    @Id
    val id: String,
    val detailId: <UNSURE HERE>
) {
    companion object {
        const val COLLECTION: String = "approval"
    }
}

detailID可以是一个String或这样的对象:

data class AIDConfiguration(
    val sId: String,
    val cId: String
)

但是如何设置该类型 - 因为我不能使用类似的东西

val detailId: AIDConfiguration | String

我想可能会做一个接口,但不确定是否有任何语法让它只是一个字符串

interface ParentConfiguration

data class AIDConfiguration(
    val sId: String,
    val cId: String
): ParentConfiguration

接着

val detailId: ParentConfiguration

任何帮助表示赞赏。

谢谢。

标签: kotlin

解决方案


一种方法可能是:

val detailId: Any

这是松散的,因为它将允许将任何类型分配给 detailId。因此,在使用之前,您必须检查类型。

fun useConfig(detailId: Any) {
    if (detailId is AIDConfiguration) {
        //Use detailId.sId and detailId.cId. Compiler smart casts to AIDConfiguration
    } else if (detailId is String)
        //Use detailId. Compiler will smart cast to String
    } else {
        //throw some exception here.
    }
}

您可能还想在设置配置时使用一些验证。检查类型是AIDConfiguration还是String

更严格一点是有一个父配置类。例如ParentConfiguration和具有AIDConfigurationStringConfiguration作为子类。

那么它就变成了:

interface ParentConfiguration

data class AIDConfiguration(
    val sId: String,
    val cId: String
): ParentConfiguration

data class StringConfiguration(
    val conf: String
): ParentConfiguration

data class Approval(
    val id: String,
    val detailId: ParentConfiguration
)

val stringConfigApproval = Approval(id = "Test1", detailId = StringConfiguration("String Conf"))
val aidConfApproval = Approval(id = "Test2", detailId = AIDConfiguration(sId = "SID", cId = "CID"))

建议查看 kotlin 文档。

https://kotlinlang.org/docs/tutorials/kotlin-for-py/inheritance.html https://kotlinlang.org/docs/reference/typecasts.html


推荐阅读