Найти в Дзене
Уроки по программированию

Получить тип переменной в Kotlin

1. Overview Иногда нам нужно определить конкретный тип переменной. Например, нам нужна информация о типе, когда мы получаем какое-то значение в необработанном виде из другой системы.
Обычно существует два распространенных сценария определения типа переменной. Один из случаев — проверка объекта на соответствие ожидаемому типу и выполнение некоторых операций. Другой сценарий — получить имя типа переменной в виде строки.
В этом уроке мы рассмотрим, как определить тип переменной в Kotlin. Конечно, мы рассмотрим оба упомянутых выше случая. 2. Проверка типа переменной Мы рассмотрим, как проверить тип переменной, на примере. 2.1. Пример: класс игрока Во-первых, давайте создадим несколько классов: package com.baeldung.typeOfVariable open class Person(val name: String, val age: Int) interface Ranking class Player(name: String, age: Int, val numberOfWins: Int) : Person(name, age), Ranking Как видно из приведенного выше кода, в пакете com.baeldung.typeOfVariable мы определили класс Perso
Оглавление

1. Overview

Иногда нам нужно определить конкретный тип переменной. Например, нам нужна информация о типе, когда мы получаем какое-то значение в необработанном виде из другой системы.

Обычно существует два распространенных сценария определения типа переменной. Один из случаев — проверка объекта на соответствие ожидаемому типу и выполнение некоторых операций. Другой сценарий — получить имя типа переменной в виде строки.

В этом уроке мы рассмотрим, как определить тип переменной в Kotlin. Конечно, мы рассмотрим оба упомянутых выше случая.

2. Проверка типа переменной

Мы рассмотрим, как проверить тип переменной, на примере.

2.1. Пример: класс игрока

Во-первых, давайте создадим несколько классов:

package com.baeldung.typeOfVariable
open class Person(val name: String, val age: Int)
interface Ranking
class Player(name: String, age: Int, val numberOfWins: Int) : Person(name, age), Ranking

Как видно из приведенного выше кода, в пакете com.baeldung.typeOfVariable мы определили класс Person, интерфейс Ranking и класс Player. Более того, класс Player наследует класс Person и реализует интерфейс Ranking.

Далее создадим несколько переменных:

private val myInt: Any = 42
private val myString: Any = "I am a string"
private val myPlayer: Any = Player("Jackson", 42, 100)

Как видим, мы создали три переменные: одну Int, одну String и одну Player. Следует отметить, что мы объявили три переменные, используя один и тот же тип: Any. Стоит отметить, что Any в Kotlin очень похож на Object в Java, что означает, что это супертип всех остальных классов. Другими словами, мы объявили три переменные в необработанном типе.

Для простоты мы будем использовать утверждения модульного теста, чтобы проверить, получаем ли мы ожидаемый тип. Поэтому давайте создадим простой тип перечисления, чтобы упростить проверку:

enum class VariableType {
INT, STRING, PLAYER, UNKNOWN
}

Далее давайте посмотрим, как проверить тип переменной.

2.2. Оператор

Мы можем использовать оператор is, чтобы проверить, имеет ли переменная ожидаемый тип: var — это ExpectedType.

Итак, далее давайте воспользуемся оператором is в функции расширения класса Any, чтобы проверить тип переменной и вернуть соответствующий экземпляр перечисления VariableType:

fun Any.getType(): VariableType {
return when (this) {
is Int -> INT
is String -> STRING
is Player -> PLAYER
else -> UNKNOWN
}
}

Теперь давайте напишем тест, чтобы проверить, может ли он дать нам контрольный тип:

assertTrue { INT == myInt.getType() }
assertTrue { STRING == myString.getType() }
assertTrue { PLAYER == myPlayer.getType() }

Если мы запустим тест, он пройдет.

Стоит отметить, что, поскольку наш класс Player является подтипом Person и Ranking,
если мы применим оператор is к экземпляру Player и двум супертипам, мы также получим true:

assertTrue { myPlayer is Person }
assertTrue { myPlayer is Ranking }

Следовательно, оператор is — это то, что нужно, если мы хотим проверить, является ли объект ожидаемым типом. Однако иногда у нас нет ожидаемого типа для проверки. Вместо этого нам нужно получить имя типа объекта.

Далее посмотрим, как этого добиться.

3. Получение имени типа переменной

Мы можем получить имя типа из объекта KClass объекта или его объекта Class. Далее давайте посмотрим на них в действии.

3.1. Имя типа Котлин

KClass определяет атрибуты simpleName иqualName для переноса имени типа объекта.

Один простой способ получить экземпляр KClass из объекта Kotlin — использовать ссылку на класс myObject::class.

Итак, теперь давайте проверим, могут ли ссылки на классы сообщать ожидаемые имена типов:

assertTrue { "String" == myString::class.simpleName }
assertTrue { "Int" == myInt::class.simpleName }
assertTrue { "Player" == myPlayer::class.simpleName }

Тест проходит, если мы даем ему прогон. Если нам нужно полное имя типа вместо простого имени, мы можем прочитать поле KClass.qualifiedName:

assertTrue { "kotlin.String" == myString::class.qualifiedName }
assertTrue { "kotlin.Int" == myInt::class.qualifiedName }
assertTrue { "com.baeldung.typeOfVariable.Player" == myPlayer::class.qualifiedName }

3.2. Имя типа Java

В качестве альтернативы мы можем получить имя типа из соответствующего объекта класса Java.

Итак, ключ в том, как получить объект Class в Kotlin.
Мы можем получить объект класса объекта через myObject::class.java в Kotlin.

Затем давайте создадим тест, чтобы проверить, можем ли мы получить ожидаемое имя типа через объект класса:

assertTrue { "java.lang.String" == myString::class.java.typeName }
assertTrue { "java.lang.Integer" == myInt::class.java.typeName }
assertTrue { "com.baeldung.typeOfVariable.Player" == myPlayer::class.java.typeName }

Если мы выполняем тест, он проходит.

4. Вывод

В этой статье мы узнали, как получить имя типа переменной в Kotlin.

Оригинал статьи: https://www.baeldung.com/kotlin/find-type-variable