Using Reified Type Parameters with Inline Functions in Kotlin
📖 Scenario: Imagine you are building a simple utility in Kotlin to check the type of objects at runtime without explicitly passing the class type. This is useful when you want to write cleaner and safer code that can check types dynamically.
🎯 Goal: You will create an inline function with a reified type parameter to check if an object is of a certain type, then use it to test different objects.
📋 What You'll Learn
Create a variable holding an object of type Any with a specific value
Create an inline function with a reified type parameter called isOfType
Use the is keyword inside the function to check the type
Call the function with different type checks
Print the results of the type checks
💡 Why This Matters
🌍 Real World
Reified type parameters allow Kotlin developers to write cleaner and safer code when working with generics and type checks, especially in libraries and frameworks.
💼 Career
Understanding inline functions with reified type parameters is important for Kotlin developers working on Android apps, backend services, or any Kotlin-based projects that require type-safe operations.
Progress0 / 4 steps
1
Create an object variable
Create a variable called obj of type Any and assign it the string value "Hello Kotlin".
Kotlin
Hint
Use val obj: Any = "Hello Kotlin" to create the variable.
2
Create an inline function with reified type parameter
Create an inline function called isOfType with a reified type parameter T. The function should take a parameter value of type Any and return true if value is of type T, otherwise false. Use the is keyword inside the function.
Kotlin
Hint
Use inline fun <reified T> isOfType(value: Any): Boolean and inside return value is T.
3
Use the inline function to check types
Use the isOfType function to check if obj is a String and if obj is an Int. Store the results in variables called checkString and checkInt respectively.
Kotlin
Hint
Call isOfType<String>(obj) and isOfType<Int>(obj) and assign to variables.
4
Print the results
Print the values of checkString and checkInt using println.
Kotlin
Hint
Use println(checkString) and println(checkInt) to show the results.
Practice
(1/5)
1. What is the main benefit of using reified type parameters in Kotlin inline functions?
easy
A. They improve performance by avoiding inline expansion.
B. They allow access to the actual type at runtime inside the function.
C. They enable functions to be called without specifying type arguments.
D. They automatically convert types to strings.
Solution
Step 1: Understand reified type parameters
Reified type parameters let you use the real type inside an inline function at runtime, unlike normal generics which erase type info.
Step 2: Identify the main benefit
This means you can do type checks and casts safely inside the function using the actual type.
Final Answer:
They allow access to the actual type at runtime inside the function. -> Option B
Quick Check:
Reified = real type access [OK]
Hint: Reified means real type info available at runtime [OK]
Common Mistakes:
Thinking reified improves performance by avoiding inline
Believing reified removes need for type arguments
Confusing reified with automatic type conversion
2. Which of the following is the correct syntax to declare an inline function with a reified type parameter T in Kotlin?
easy
A. inline fun myFunction() { }
B. inline fun <T> myFunction() { }
C. fun inline myFunction() { }
D. fun inline myFunction() { }
Solution
Step 1: Recall syntax for inline with reified
The correct syntax places inline before the function and reified before the type parameter inside angle brackets.
Step 2: Check each option
inline fun myFunction() { } correctly uses inline fun <reified T> myFunction(). Others have wrong order or missing keywords.
Final Answer:
inline fun <reified T> myFunction() { } -> Option A
Quick Check:
inline + reified before T = correct syntax [OK]
Hint: Put 'inline' before fun and 'reified' before type param [OK]
Common Mistakes:
Placing 'reified' after the type parameter
Writing 'fun inline' instead of 'inline fun'
Omitting 'inline' keyword
3. What will be the output of the following Kotlin code?
inline fun isString(value: Any): Boolean {
return value is T
}
fun main() {
println(isString<String>("hello"))
println(isString<Int>(123))
println(isString<Double>(123.0))
}
medium
A. false\nfalse\nfalse
B. true\nfalse\ntrue
C. false\ntrue\nfalse
D. true\ntrue\ntrue
Solution
Step 1: Understand the function behavior
The function checks if the given value is of type T using the reified type parameter for runtime type check.
Step 2: Evaluate each println call
First call: isString<String>("hello") -- "hello" is String -> true. Second call: isString<Int>(123) -- 123 is Int -> true. Third call: isString<Double>(123.0) -- 123.0 is Double -> true. Output: true\ntrue\ntrue.
Final Answer:
true\ntrue\ntrue -> Option D
Quick Check:
All type checks match = true true true [OK]
Hint: Reified lets 'is' check real type at runtime [OK]
Common Mistakes:
Assuming type erasure causes false results
Mixing up types in the is check
Ignoring that reified allows runtime type check
4. Identify the error in the following Kotlin code snippet:
fun printTypeName() {
println(T::class.simpleName)
}
fun main() {
printTypeName<String>()
}
medium
A. Missing type argument when calling printTypeName.
B. T::class.simpleName is not a valid expression.
C. Cannot use reified type parameter in a non-inline function.
D. Function printTypeName must return a value.
Solution
Step 1: Check function declaration
The function uses reified type parameter but is not marked inline. This is not allowed in Kotlin.
Step 2: Understand Kotlin rules for reified
Reified type parameters require the function to be inline to preserve type info at runtime.
Final Answer:
Cannot use reified type parameter in a non-inline function. -> Option C
Quick Check:
Reified requires inline function [OK]
Hint: Reified always needs inline keyword [OK]
Common Mistakes:
Forgetting to mark function as inline
Thinking reified works in normal functions
Misunderstanding T::class usage
5. You want to create a generic inline function createInstance that returns a new instance of type T using its no-argument constructor. Which of the following implementations correctly uses reified type parameters to achieve this?
hard
A. inline fun createInstance(): T = T::class.java.newInstance()
B. fun createInstance(): T = T::class.java.getDeclaredConstructor().newInstance()
C. inline fun <T> createInstance(): T = T::class.java.newInstance()
D. inline fun createInstance(): T = T()
Solution
Step 1: Understand how to create instance with reified
Using reified lets us access T::class.java at runtime to call newInstance() for no-arg constructor.
Step 2: Check each option
inline fun createInstance(): T = T::class.java.newInstance() uses inline and reified correctly and calls newInstance(). fun createInstance(): T = T::class.java.getDeclaredConstructor().newInstance() is not inline, so reified is invalid. inline fun <T> createInstance(): T = T::class.java.newInstance() lacks reified, so T::class is invalid. inline fun createInstance(): T = T() tries to call T() which is invalid syntax in Kotlin.
Final Answer:
inline fun <reified T> createInstance(): T = T::class.java.newInstance() -> Option A