Kotlin 数据类属性:多种类型

mar*_*elc 3 kotlin

在 Kotlin 中,数据类的属性可以有多种类型吗?例如:

val CurrentValue: Double?|String 或 val CurrentValue: String|Array?

我在文档中找不到它。

Som*_*boy 12

联合类型在 Kotlin 中不是一个东西。

您可以使用 asealed class代替。

sealed class CurrentValue<T>(val value: T) {
  class TextualValue(value: String) : CurrentValue<String>(value)
  class NumericValue(value: Double) : CurrentValue<Double>(value)
}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用详尽的when表达式(类似于switch其他语言)以便以类型安全的方式访问该值:

fun doSomething(value: CurrentValue<*>) {
  
  when(value) {
    is TextualValue -> value.value // is recognised as a String
    is NumericValue -> value.value // is recognised as a Double
  }

}
Run Code Online (Sandbox Code Playgroud)

如果创建类型对您来说太多了,那么您可以执行语句when并根据参数的类型处理参数,或许还可以对其进行规范化:

fun parseValue(value: Any?): Double? = when(value){
  is Double -> value
  is String -> value.toDoubleOrNull()
  is Int -> value.toDouble()
  else -> null
}
Run Code Online (Sandbox Code Playgroud)