Любое имя переменной в Kotlin - PullRequest
1 голос
/ 26 апреля 2020

У меня есть класс машинописи, и он принимает любой в качестве имени члена:

interface ControlTagType {
    type?: String | null;

    [name: string]: any
}

class ControlTag {
    tagSource: String | null = null;

    tag: ControlTagType | null = null;
}

export { ControlTag };

, поэтому я могу использовать этот класс в vuejs следующим образом:

controlTag.push({ tagSource: 'USER', tag: { type: 'X', TAG_1: 'TAG_X' } });
controlTag.push({ tagSource: 'AUTO', tag: { type: 'Y', TAG_2: 'TAG_Y' } });

This Это единственное решение для моей другой проблемы.

Но я не смог найти, как достичь этого обобщенного c члена в kotlin:

У меня есть класс enum, и я использовал его, пока сериализация:

  @JsonValue
  fun value(): X {
    return X( this.name : this.name)
  }

, например

data class X(val [name: string]: any)

Я могу сделать следующее, но это слишком сложно и должно быть сделано для каждого класса:

 @JsonValue
  fun value(): Any? {
    when (this.name) {
      XX_XX.name -> {
        return object {
          var XX_XX: String = name
        }
      }
      YY_YY.name -> {
        return object {
          var YY_YY: String = name
        }
      }
      ZZ_ZZ.name -> {
        return object {
          var ZZ_ZZ: String = name
        }
      }
      else -> return null
    }
  }

Также в этой реализации он преобразует имя параметра в нижний регистр:

{"type":"XX","xx_XX":"XX_XX"}

1 Ответ

0 голосов
/ 26 апреля 2020

Нет типов индекса в Kotlin.

Но вы можете использовать различные реализации на основе интерфейса вместо val[name: string]: any

interface ControlTagType {
  val type: String?
}

data class ControlTag(
    val tagSource: String? = null,
    val tag: ControlTagType? = null
)

data class FirstControlTagType(
    override val type: String? = null,
    val firstOne: String? = null
) : ControlTagType

data class SecondControlTagType(
    override val type: String? = null,
    val secondOne: String? = null
) : ControlTagType

Kotlin предназначен для нескольких языков и конструкции, как val[name: string]: any больше динамических c, чем, например, Java язык.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...