📖 Scenario: Imagine you are building a simple program that checks the type of an input value and responds differently based on whether it is a number or text. This is common when you want to handle different kinds of data safely.
🎯 Goal: You will create a Kotlin program that uses when and if statements with smart casts to check the type of a variable and print messages accordingly.
📋 What You'll Learn
Create a variable called input with a value of type Any that can be either a String or an Int.
Create a variable called threshold with the integer value 10.
Use a when expression to check if input is a String or an Int.
Inside the when branches, use smart casts to access input as String or Int without explicit casting.
If input is an Int, use an if statement to check if it is greater than threshold.
Print appropriate messages for each case.
💡 Why This Matters
🌍 Real World
Programs often receive data of unknown type, like user input or data from the internet. Using smart casts helps safely check and use this data without errors.
💼 Career
Understanding smart casts and type checking is important for Kotlin developers to write clean, safe, and efficient code in Android apps and backend services.
Progress0 / 4 steps
1
Create the input variable
Create a variable called input of type Any and set it to the integer value 15.
Kotlin
Hint
Use val input: Any = 15 to create the variable.
2
Create the threshold variable
Create a variable called threshold and set it to the integer value 10.
Kotlin
Hint
Use val threshold = 10 to create the variable.
3
Use when with smart casts
Write a when expression on input with branches for is String and is Int. Inside each branch, use input as the smart casted type. For the Int branch, add an if statement to check if input is greater than threshold.
Kotlin
Hint
Use when (input) { is String -> ... is Int -> ... } and inside the Int branch use if (input > threshold).
4
Print the result
Run the program and print the output from the when expression.
Kotlin
Hint
Running the program should print: Input is an integer greater than 10
Practice
(1/5)
1. What does Kotlin's smart cast feature do inside an if or when block?
easy
A. Disables type checking inside the block
B. Requires explicit casting of variables after type checks
C. Automatically treats a variable as a specific type after a type check
D. Converts all variables to strings inside the block
Solution
Step 1: Understand smart cast purpose
Smart casts let Kotlin automatically treat a variable as a more specific type after you check its type.
Step 2: Apply to if/when blocks
Inside if or when, Kotlin knows the variable's type and lets you use it without manual casting.
Final Answer:
Automatically treats a variable as a specific type after a type check -> Option C
Quick Check:
Smart cast = automatic type use after check [OK]
Hint: Smart casts auto-change type after check in if/when [OK]
Common Mistakes:
Thinking manual cast is always needed
Assuming smart casts disable type checks
Believing variables convert to string automatically
2. Which of the following is the correct syntax to use smart casts in a when expression for variable obj?
easy
A. when obj { is String -> println(obj.length) else -> println("Not a string") }
B. when (obj) { obj is String -> println(obj.length) else -> println("Not a string") }
C. when (obj) { String -> println(obj.length) else -> println("Not a string") }
D. when (obj) { is String -> println(obj.length) else -> println("Not a string") }
Solution
Step 1: Check correct when syntax
The when expression requires parentheses around the variable: when (obj).
Step 2: Use type check correctly
The correct type check is is String without repeating variable name inside the block.
Final Answer:
when (obj) { is String -> println(obj.length) else -> println("Not a string") } -> Option D
Quick Check:
Correct when syntax uses parentheses and is [OK]
Hint: Use parentheses and 'is' keyword in when [OK]
Common Mistakes:
Omitting parentheses around variable
Using variable name inside when branches
Using type name without 'is' keyword
3. What will be the output of this Kotlin code?
fun test(obj: Any) {
when (obj) {
is String -> println(obj.length)
is Int -> println(obj + 1)
else -> println("Unknown")
}
}
test("Hello")
test(5)
test(3.14)
medium
A. 5
6
7
B. 5
6
Unknown
C. Hello
6
Unknown
D. 5
5
Unknown
Solution
Step 1: Analyze each call
For test("Hello"), obj is String, so prints length 5. For test(5), obj is Int, so prints 5 + 1 = 6. For test(3.14), no matching type, prints "Unknown".
Step 2: Confirm output lines
Outputs are: 5 6 Unknown
Final Answer:
5
6
Unknown -> Option B
Quick Check:
Smart cast uses type to choose output [OK]
Hint: Match type in when to get output [OK]
Common Mistakes:
Confusing string length with string itself
Adding 1 to string instead of int
Expecting default else to print number
4. Identify the error in this Kotlin code using smart casts:
fun check(obj: Any) {
if (obj is String) {
println(obj.length)
} else if (obj is Int) {
println(obj + 1)
} else {
println(obj.length)
}
}
medium
A. Trying to access length on obj in else block without type check
B. Missing parentheses in if condition
C. Using else if instead of when
D. Smart casts do not work inside if blocks
Solution
Step 1: Review else block usage
In the else block, obj can be any type, but code tries to access obj.length which is invalid for non-String types.
Step 2: Understand smart cast limits
Smart casts only apply after type checks. Here, no type check before accessing length in else block causes error.
Final Answer:
Trying to access length on obj in else block without type check -> Option A
Quick Check:
Access property only after type check [OK]
Hint: Check type before accessing properties [OK]
Common Mistakes:
Assuming else block has smart cast automatically
Confusing else if with when
Thinking smart casts fail inside if blocks
5. Given a list of Any objects, write a Kotlin function using when with smart casts to return a list of strings describing each element's type and value. What is the correct implementation?
fun describeList(items: List<Any>): List<String> {
return items.map { item ->
when (item) {
is String -> "String of length ${'$'}{item.length}"
is Int -> "Int with value ${'$'}item"
else -> "Unknown type"
}
}
}
hard
A. Correct as is, smart casts allow using item.length and item directly
B. Needs explicit casts like (item as String).length and (item as Int)
C. Cannot use smart casts inside lambda expressions
D. Must use if-else instead of when for smart casts
Solution
Step 1: Check smart cast usage in when
The when expression smart casts item to String or Int automatically after type check.
Step 2: Confirm lambda and map usage
Inside the lambda, smart casts work normally, so accessing item.length and item is valid without explicit casts.
Final Answer:
Correct as is, smart casts allow using item.length and item directly -> Option A
Quick Check:
Smart casts work inside lambdas and when [OK]
Hint: Smart casts work inside lambdas and when blocks [OK]
Common Mistakes:
Adding unnecessary explicit casts
Thinking smart casts don't work in lambdas
Replacing when with if-else unnecessarily
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.