Union types

sealed class JsonValue<out T>(val value: T) {
    class JsonString(value: String) : JsonValue<String>(value)
    class JsonBoolean(value: Boolean) : JsonValue<Boolean>(value)
    class JsonNumber(value: Number) : JsonValue<Number>(value)
    object JsonNull : JsonValue<Nothing?>(null)
    class JsonArray<V>(value: Array<V>) : JsonValue<Array<V>>(value)
    class JsonObject(value: Map<String, Any?>) : JsonValue<Map<String, Any?>>(value)
}

fun main() {
  var pi: JsonValue<Any?>
  pi = JsonValue.JsonString("pi")
  pi = JsonValue.JsonNumber(3.14)
}

You just need to specify the type as JsonValue<Any?>

1 Like