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,wheni 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,wheni po wcześniejszych returnach valzapewnia 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.