如何在 kotlin 中的数据类中为变量提供多种类型

Cha*_*a D 3 kotlin

我想要一个执行此操作的数据类:

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

variantUnit 可以是字符串列表或枚举值,

enum class variantUnitOptions {
     KG,
     BUNDLE,
     BOX,
     PIECE
}
Run Code Online (Sandbox Code Playgroud)

由于我们不能像 || 一样使用 OR,所以我尝试使用密封类以这种方式包含字符串或枚举列表,

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
    )
Run Code Online (Sandbox Code Playgroud)

但通过这种方式,我收到了 Type 预期的错误,我现在无法给出类型,因为它可以是List<String>variantUnitOptions。如何实现预期的行为?任何帮助是极大的赞赏。

提前致谢

G.D*_*rov 5

您不必将 generic 和 value 放入VarianUnit. 这样做:

sealed class VariantUnit {
    class ListOfUnits(val value: List<String>) : VariantUnit()
    class SelectedUnit(val value: variantUnitOptions) : VariantUnit()
}
Run Code Online (Sandbox Code Playgroud)

那么你可以使用密封类作为值:

data class VariantModal (
    // other values
    val variantUnit: VariantUnit,
)
Run Code Online (Sandbox Code Playgroud)

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

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)