Safe casts let you try to change a value's type without causing errors if it doesn't fit. It helps keep your program running smoothly.
Safe casts with as? in Kotlin
val result = value as? TargetType
The as? operator tries to cast value to TargetType.
If the cast works, result holds the new type; if not, result is null.
obj to a String. It works, so str holds "Hello".val obj: Any = "Hello" val str: String? = obj as? String
Int to a String. It fails, so str is null.val obj: Any = 123 val str: String? = obj as? String
obj is null, the safe cast returns null without error.val obj: Any? = null val str: String? = obj as? String
This program tries to safely cast two values to String. The first cast works and prints the string. The second fails and prints null without crashing.
fun main() { val unknown: Any = "Kotlin" val safeCast: String? = unknown as? String println("Safe cast result: $safeCast") val number: Any = 42 val failedCast: String? = number as? String println("Failed cast result: $failedCast") }
Use safe casts when you want to avoid exceptions from wrong type conversions.
If you use the regular as operator and the cast fails, your program will crash with a ClassCastException.
Safe casts return null on failure, so check for null before using the result.
Safe casts with as? try to convert a value's type without crashing.
If the cast is not possible, they return null instead of throwing an error.
This helps keep your program safe and stable when working with uncertain types.
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
