What if your program could try a risky action without crashing, just like testing a fruit before biting?
Why Safe casts with as? in Kotlin? - Purpose & Use Cases
Imagine you have a box labeled 'Fruit' but inside it could be an apple or a banana. You want to take out the apple and eat it, but if it's not an apple, you might get hurt trying to bite it.
Manually checking the type of an object before using it is slow and messy. You might forget to check, causing your program to crash unexpectedly. It's like blindly biting into the box hoping it's an apple.
Safe casts with as? let you try to convert an object to a type safely. If it's the right type, you get the object; if not, you get null instead of a crash. It's like gently checking if the fruit is an apple before biting.
if (obj is String) { val str = obj // use str } else { // handle not a String }
val str: String? = obj as? String if (str != null) { // use str safely }
This lets your program handle uncertain types gracefully, avoiding crashes and making your code cleaner and safer.
When reading data from a mixed list of objects, you can safely try to treat each item as a specific type without worrying about errors stopping your app.
Manual type checks are error-prone and clutter code.
as? safely tries to cast and returns null if it fails.
It helps write safer, cleaner, and more reliable Kotlin code.
Practice
What does the safe cast operator as? do in Kotlin?
Solution
Step 1: Understand the safe cast operator
Theas?operator attempts to cast a value to a specified type safely.Step 2: Behavior on failure
If the cast is not possible, instead of throwing an error, it returnsnull.Final Answer:
It tries to cast a value to a type and returns null if it fails. -> Option CQuick Check:
Safe cast = returns null on failure [OK]
- Confusing safe cast with forced cast
- Thinking it throws an exception on failure
- Assuming it converts to string automatically
Which of the following is the correct syntax for a safe cast in Kotlin?
val x = obj ___ String
Solution
Step 1: Identify safe cast syntax
In Kotlin, the safe cast operator isas?which tries to cast safely.Step 2: Match syntax to code
The codeval x = obj as? Stringattempts to castobjtoStringsafely.Final Answer:
as? -> Option AQuick Check:
Safe cast syntax = as? [OK]
- Using as without question mark causes exception
- Confusing is (type check) with as? (cast)
- Using to which is for conversions, not casting
What will be the output of this Kotlin code?
val obj: Any = 123 val str: String? = obj as? String println(str)
Solution
Step 1: Analyze the cast attempt
Variableobjholds an integer123, but we try to cast it toStringusing safe castas?.Step 2: Safe cast behavior
Sinceobjis not aString, the safe cast returnsnullinstead of throwing an error.Final Answer:
null -> Option AQuick Check:
Safe cast fails = null output [OK]
- Expecting ClassCastException instead of null
- Thinking it converts integer to string automatically
- Confusing safe cast with forced cast
Identify the error in this Kotlin code snippet and fix it:
val obj: Any = "Hello" val num: Int = obj as? Int println(num)
Solution
Step 1: Analyze variable types and cast
The safe castobj as? Intreturnsnullif cast fails, so the result is nullableInt?.Step 2: Fix type mismatch
Declaringnumas non-nullableIntcauses a type mismatch error. Changing it toInt?fixes this.Final Answer:
Change val num: Int to val num: Int? -> Option BQuick Check:
Safe cast returns nullable type [OK]
- Using non-nullable type for safe cast result
- Replacing safe cast with forced cast causing exceptions
- Ignoring type mismatch errors
You have a list of Any objects: listOf(1, "two", 3.0, "four"). You want to create a new list containing only the strings using safe casts. Which Kotlin code correctly does this?
Solution
Step 1: Understand the goal
We want to safely cast each element toStringand keep only successful casts.Step 2: Analyze options
val strings = list.map { it as? String }.filterNotNull() uses safe castas?which returnsnullfor non-strings, then filters outnullvalues withfilterNotNull(). This correctly produces a list of strings.Step 3: Why others are incorrect
val strings = list.map { it as String } forces cast and will throw exception on non-strings. val strings = list.filter { it is String } filters by type but does not cast, so type is stillAny. val strings = list.mapNotNull { it as String? } tries to cast with forced cast insidemapNotNullwhich will throw exception.Final Answer:
val strings = list.map { it as? String }.filterNotNull() -> Option DQuick Check:
Safe cast + filterNotNull = filtered strings [OK]
- Using forced cast causing exceptions
- Filtering type without casting
- Misusing mapNotNull with forced cast
Ready to prove it?
Pass the test and this pattern moves unknown
