0Pricing
Kotlin Academy · Lekcja

Smart casty

Automatycznie rzutuj po sprawdzeniu

Smart casty to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Czym są smart casty

Po sprawdzeniu typu wartości Kotlin zapamiętuje ten fakt. Wewnątrz sprawdzanego bloku automatycznie traktuje wartość jako typ zawężony.

Ta funkcja nazywa się smart cast i eliminuje ręczne rzutowanie.

Smart cast po is

Po pomyślnym sprawdzeniu is można używać wartości jako wartości danego typu bez zapisywania rzutowania.

Kompilator wykonuje je automatycznie.

fun describe(x: Any) {
    if (x is String) {
        println(x.length) // x is smart-cast to String
    }
}

fun main() {
    describe("hello")
}

Smart cast po sprawdzeniu wartości null

Smart casty działają również w przypadku wartości null. Po potwierdzeniu, że wartość nie jest równa null, jest ona traktowana jako niepusta.

fun length(text: String?): Int {
    if (text != null) {
        return text.length // smart-cast to non-null String
    }
    return 0
}

fun main() {
    println(length("abc"))
    println(length(null))
}

Smart casty w when

Sprawdzanie typów wewnątrz when również umożliwia smart casty w każdej gałęzi.

Jest to idiomatyczny sposób obsługi wielu możliwych typów.

fun area(shape: Any): Double = when (shape) {
    is Int -> shape.toDouble()
    is String -> shape.length.toDouble()
    else -> 0.0
}

fun main() {
    println(area(5))
    println(area("hello"))
}

Smart cast z wcześniejszym return

Jeśli przy wartości null nastąpi wcześniejszy return, kompilator wie, że później wartość nie jest równa null.

W pozostałej części funkcji można bezpiecznie używać tej wartości.

fun process(text: String?) {
    if (text == null) return
    println(text.uppercase()) // smart-cast here
}

fun main() {
    process("data")
    process(null)
}

Smart cast z returnem Elvis

Połączenie operatora Elvis z return również uruchamia smart cast dla pozostałego kodu.

fun process(text: String?) {
    val safe = text ?: return
    println(safe.length) // safe is non-null
}

fun main() {
    process("hi")
    process(null)
}

Warunki złożone

Smart casty uwzględniają logikę warunków złożonych z użyciem &&.

Po sprawdzeniu typu po lewej stronie prawa strona od razu widzi zawężony typ.

fun check(x: Any) {
    if (x is String && x.length > 3) {
        println("long string")
    } else {
        println("other")
    }
}

fun main() {
    check("hello")
    check(2)
}

Kiedy smart casty zawodzą

Smart casty wymagają gwarancji, że wartość nie zmieni się między sprawdzeniem a użyciem.

Mutowalna zmienna var, która może zmienić się równocześnie, może nie zostać objęta smart castem. Aby uzyskać niezawodne smart casty, należy preferować val.

fun main() {
    val text: String? = "stable"
    if (text != null) {
        println(text.length) // val smart-casts cleanly
    }
}

Lokalne val jest najbezpieczniejsze

Skopiowanie wartości do lokalnego val zapewnia niezawodne działanie smart castów.

Jest to częsty wzorzec podczas pracy z właściwościami, które mogą mieć wartość null.

class Box(val content: String?)

fun main() {
    val box = Box("item")
    val c = box.content
    if (c != null) {
        println(c.uppercase())
    }
}

Smart cast a jawne rzutowanie

Smart casty zastępują większość jawnych rzutowań as. Są bezpieczniejsze, ponieważ działają tylko tam, gdzie typ został potwierdzony.

W dalszej części poznasz jawne operatory is i as.

fun main() {
    val x: Any = "text"
    if (x is String) {
        // no need for (x as String)
        println(x.reversed())
    }
}

Połączenie wszystkiego

Smart casty pozwalają kompilatorowi automatycznie zawężać typy:

  • Po sprawdzeniu is → rzutowanie do tego typu
  • Po sprawdzeniu wartości null → rzutowanie do typu niepustego
  • Działają w if, when i po wcześniejszych returnach
  • Są najbardziej niezawodne z val
fun render(x: Any): String {
    if (x is Int) return "number " + x
    if (x is String) return "text " + x.uppercase()
    return "unknown"
}

fun main() {
    println(render(7))
    println(render("go"))
}

Szybki test

Sprawdź swoje rozumienie smart castów.

Podsumowanie

Dowiedziałeś się o smart castach:

  • Sprawdzanie typu i wartości null automatycznie zawęża typ
  • Działają w if, when i po wcześniejszych returnach
  • val zapewnia najbardziej niezawodne smart casty

Następnie bezpośrednio poznasz operatory is i as.

Często zadawane pytania

Czy lekcja „Smart casty” jest bezpłatna?

Tak — pełny tekst „Smart casty” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Smart casty”?

Automatycznie rzutuj po sprawdzeniu Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?

Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Smart casty”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?

Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. when jako wyrażenie
  2. Smart casty
  3. Operatory is i as
  4. Kompletny when
← Powrót do Kotlin Academy