我想要有一个数据类来实现以下功能:

data class VariantModal (
     val variantId: String,
     val variantName: String,
     val variantUnit: List<String> || variantUnitOptions
     val productId: String,
     val variantQuantity: Int
)

变量单元可以是字符串列表或枚举值,

enum class variantUnitOptions {
     KG,
     BUNDLE,
     BOX,
     PIECE
}

因为我们不能使用OR LIKE||,所以我try 使用密封类以这种方式拥有字符串或枚举列表,

sealed class VariantUnit<T>(val value: T) {
     class ListOfUnits(value: List<String>) : VariantUnit< List<String>>(value)
     class SelectedUnit(value: variantUnitOptions) : VariantUnit<variantUnitOptions (value)
}
data class VariantModal (
    val variantId: String,
    val variantName: String,
    val variantUnit: VariantUnit<>,  //error here
    val productId: String,
    val variantQuantity: Int
    )

但是在这种方式下,我得到了预期的类型错误,我现在不能给出类型,因为它可以是List<String>variantUnitOptions.如何实现预期的行为?如有任何帮助,我们不胜感激.

提前谢谢你

推荐答案

您不必将泛型和值设为VarianUnit.像这样做:

sealed class VariantUnit {
    class ListOfUnits(val value: List<String>) : VariantUnit()
    class SelectedUnit(val value: variantUnitOptions) : VariantUnit()
}

然后,您可以使用密封类作为值:

data class VariantModal (
    // other values
    val variantUnit: VariantUnit,
)

并像通常的密封类一样处理它:

fun doSomethingWithVariantUnit(variantUnit: VariantUnit) {
    when (variantUnit) {
        is VariantUnit.ListOfUnits -> {
            val unitsList: List<String> = variantUnit.value
            // unitsList is a list, take its size for example
            unitsList.size
        }
        is VariantUnit.SelectedUnit -> {
            val unitOption: variantUnitOptions = variantUnit.value
            // unitOption is an enum, take its name for example
            unitOption.name
        }
    }
}

Kotlin相关问答推荐

测试Compose Multiplatform UI时,为另一个文件设置ComposeRule()

在kotlin中使用List(mylist. size){index—TODO()}或Map迭代>

Scala与Kotlin中的迭代

如何通过更改现有数据类型来执行Android房间数据库迁移?

在 detekt 配置文件中找不到某些属性

将一个列表元素分组为多个组(indexBy)

gradle 如何 Select 以-jvm结尾的库?

在 Kotlin 中,为什么在 `+` 之前但在 `.` 之前没有换行符?

如何在 Android Jetpack Compose 中的画布上绘制一侧加厚的描边?

Jetpack Compose – LazyColumn 不重组

在Kotlin中传递并使用函数作为构造函数参数

在 gradle android library kotlin 项目中禁用 META-INF/* 生成

Kotlin:如何修改成对的值?

在 suspendCoroutine 块中调用挂起函数的适当方法是什么?

Kotlin - 具有私有构造函数的类的工厂函数

Failure delivering result on activity result

尾随 lambda 语法(Kotlin)的目的是什么?

如何在kotlin用mockito模仿lambda

如何在 Kotlin 中按字母顺序对字符串进行排序

如何在 Kotlin 中将串联转换为模板