Kotlin в IntelliJ IDEA Kotlin змінні Kotlin типи даних Kotlin операції з числами Kotlin умовні вирази Kotlin умовні конструкції Kotlin цикли Kotlin послідовності Kotlin масиви Kotlin функціональне програмування Kotlin змінна кількість параметрів. Vararg Kotlin повернення результату. оператор return Kotlin однорядкові і локальні функції Kotlin перевантаження функцій Kotlin Лямбда-вирази Kotlin функції вищого порядку Kotlin Анонімні функції Kotlin ООП Класи і об'єкти Kotlin ООП властивості Kotlin ООП конструктор Kotlin ООП функції в класах Kotlin ООП Пакети та імпорт Kotlin ООП модифікатори видимості Kotlin ООП вкладені класи Kotlin ООП інтерфейси Kotlin ООП спадкування Kotlin ООП Перевизначення методів і властивостей Kotlin ООП Абстрактні класи та методи Kotlin ООП Data-класи Kotlin ООП перерахування enums Kotlin ООП Null і nullable-типи Kotlin ООП Обробка винятків Kotlin ООП перетворення типів Kotlin ООП Інфіксна функція Kotlin ООП функції розширення Kotlin ООП Узагальнені класи і функції Kotlin ООП обмеження узагальнень Kotlin ООП Варіантність, коваріантність і контраваріантність Kotlin Колекції. Змінювані і незмінні колекції Kotlin Колекції. LIST список Kotlin Колекції. Set Kotlin Колекції. Map

Kotlin ООП перетворення типів


Нерідко може виникати задача по перетворенню типів, наприклад, щоб використовувати дані одного типу в констексте, де потрібні дані іншого типу. В цьому випадку Kotlin представляє ряд можливостей по перетворенню типів.


Вбудовані методи перетворення типів

Для перетворення даних одного типу в інший можна використовувати вбудовані такі функції, які є у базових типів (Int, Long, Double і т.д.):

  • toByte

  • toShort

  • toInt

  • будь ласка

  • плавати

  • toDouble

  • придане

Всі ці функції перетворюють дані в той тип, які йде після префікса to: to Byte .

val s: String = "12"
val d: Int = s.toInt()
println(d)

В даному випадку рядок s перетворюється в число d. Просто так передати рядок змінної типу Int, ми не можемо, незважаючи на те, що начебто рядок і містить число 12:

val d: Int = "12"   // ! Ошибка

Однак треба враховувати, що значення не завжди може бути перетворено до певного типу. І в цьому випадку генерується виняток. Відповідно в таких випадках бажано відловлювати виняток:

val s: String = "tom"
try {
    val d: Int = s.toInt()
    println(d)
}
catch(e: NumberFormatException){
    println(e.message)
}

Smart cast і оператор is

Оператор is дозволяє перевірити вираз на приналежність певного типу даних. Якщо локальна змінна або властивість успішно пройде перевірку на приналежність певного типу, то далі немає потреби додатково приводити значення до цього типу. Дані перетворення ще називаються smart casts або "розумні перетворення".

fun main(args: Array<String>) {
 
    square(5)
}
 
fun square(d: Any){
    //val t = d * d   // недопустимая операция - d - не число, а объект типа Any
    if(d is Int)
        println(d * d)  // норм, d уже представляет тип Int
    else
        println("d is not an Int")
}

Тут у функції double значення параметра d за допомогою оператора is перевіряється на приналежність типу Int. Якщо воно являє число, то на консоль виводиться квадрат цього числа. Причому навіть якщо значення являє число, як в даному випадку, то до застосування оператора is воно тим не менш належить типу Any. І тільки застосування оператора is перетворює значення з типу Any в тип Int. Відповідно множення числа проводиться без помилок.


Явні перетворення і оператор as

Також ми можемо явно приводити значення одного типу до іншого за допомогою оператора as :

fun main(args: Array<String>) {
 
    square(5)
}
 
fun square(d: Any){
    val t = d as Int    // приводим к типу Int
    println(t * t)
}

Однак в разі якщо перетворення завершиться невдало, то буде згенеровано виняток ClassCastException . Щоб уникнути викиду винятку, ми можемо застосовувати більш безпечну версію оператора as? , Яка в разі невдачі перетворення повертає null.

val name : String  = "Tom"
val id: Int? = name as? Int
println(id)     // null

В даному випадку оператор as? поверне null, так як рядок можна перетворити в число.


Наш партнер:
beta test mp3 playlist downloader