What does it mean that Kotlin extensions are resolved statically?
It means that extension functions are determined by the type of the variable at compile time, not by the actual object instance at runtime.
Click to reveal answer
intermediate
Given <code>open class A</code> and <code>class B : A()</code>, if you define an extension function for <code>A</code> and another for <code>B</code>, which one is called when you use a variable of type <code>A</code> holding an instance of <code>B</code>?
The extension function for A is called because extensions are resolved based on the variable's declared type, not the actual instance type.
Click to reveal answer
intermediate
Why can't extension functions be overridden in Kotlin?
Because extensions are resolved statically at compile time, they are not part of the class's virtual method table and thus cannot be overridden like member functions.
Click to reveal answer
beginner
How can you call a member function instead of an extension function if both have the same signature?
The member function always takes precedence over an extension function with the same signature when called on an instance.
Click to reveal answer
beginner
Explain with a simple code example how Kotlin resolves extensions statically.
open class A
class B : A()
fun A.foo() = "A"
fun B.foo() = "B"
fun main() {
val a: A = B()
println(a.foo()) // Prints "A" because extension is resolved by variable type
}
Click to reveal answer
In Kotlin, when you call an extension function on a variable, which type determines which extension is used?
AThe runtime type of the object
BThe declared type of the variable
CThe superclass type
DThe most derived type available
✗ Incorrect
Extension functions are resolved statically based on the declared type of the variable at compile time.
If a class has a member function and an extension function with the same name and parameters, which one is called?
AThe member function
BThe extension function
CBoth are called
DIt causes a compile error
✗ Incorrect
Member functions always take precedence over extension functions with the same signature.
Can extension functions be overridden in subclasses in Kotlin?
AYes, like normal member functions
BOnly if the subclass defines the same extension
CNo, because they are resolved statically
DOnly if marked open
✗ Incorrect
Extensions are resolved statically and are not part of the class inheritance mechanism, so they cannot be overridden.
What will this code print?
open class A
class B : A()
fun A.foo() = "A"
fun B.foo() = "B"
fun main() {
val a: A = B()
println(a.foo())
}
A"A"
B"B"
CCompilation error
DRuntime exception
✗ Incorrect
The extension function for A is called because the variable a is declared as type A.
Why are Kotlin extension functions useful despite being resolved statically?
AThey change the runtime type of objects
BThey override existing member functions
CThey replace inheritance
DThey allow adding functions to classes without modifying them
✗ Incorrect
Extensions let you add new functions to classes without changing their source code or inheritance.
Explain how Kotlin resolves extension functions and why this means they cannot be overridden.
Think about when the compiler decides which extension to call.
You got /4 concepts.
Describe a scenario with classes A and B where B inherits A, and both have extension functions. What happens when you call the extension on a variable typed as A but holding B?
Focus on the difference between declared type and actual instance.
You got /4 concepts.
Practice
(1/5)
1. What does it mean that Kotlin extension functions are resolved statically?
easy
A. Extension functions override member functions dynamically.
B. The extension function called depends on the variable's declared type, not the actual object type.
C. The extension function is chosen based on the runtime type of the object.
D. Extension functions can change the original class's source code.
Solution
Step 1: Understand static resolution
Static resolution means decisions are made at compile time, not runtime.
Step 2: Apply to extension functions
Kotlin chooses the extension function based on the variable's declared type, ignoring the actual object type.
Final Answer:
The extension function called depends on the variable's declared type, not the actual object type. -> Option B
Quick Check:
Extensions resolved statically = based on declared type [OK]
Hint: Remember: extensions use variable type, not object type [OK]
Common Mistakes:
Thinking extension functions override member functions dynamically
Assuming extension functions change the original class
Confusing static with dynamic dispatch
2. Which of the following is the correct syntax to declare an extension function greet for class Person in Kotlin?
easy
A. fun greet() Person { println("Hello") }
B. fun greet(Person) { println("Hello") }
C. extension fun Person.greet() { println("Hello") }
D. fun Person.greet() { println("Hello") }
Solution
Step 1: Recall extension function syntax
Extension functions use the syntax: fun ClassName.functionName() { ... }
Step 2: Match syntax to options
fun Person.greet() { println("Hello") } matches the correct syntax: fun Person.greet() { println("Hello") }
Final Answer:
fun Person.greet() { println("Hello") } -> Option D
Quick Check:
Extension syntax = fun ClassName.functionName() [OK]
Hint: Extension syntax: fun ClassName.functionName() [OK]
Common Mistakes:
Using 'extension' keyword which doesn't exist
Incorrect parameter placement
Missing receiver type before function name
3. Consider the code:
open class Base
class Derived : Base()
fun Base.foo() = "Base"
fun Derived.foo() = "Derived"
fun printFoo(b: Base) {
println(b.foo())
}
fun main() {
val d: Derived = Derived()
printFoo(d)
}
What is the output when main() runs?
medium
A. Compilation error
B. Derived
C. Base
D. Runtime exception
Solution
Step 1: Analyze parameter type in printFoo
printFoo takes a parameter of type Base, so inside printFoo, b is of type Base.
Step 2: Understand extension resolution
Extension functions are resolved statically by the declared type, so b.foo() calls Base.foo(), not Derived.foo().
Final Answer:
Base -> Option C
Quick Check:
Extension call depends on declared type = Base [OK]
Hint: Extension call uses parameter type, not actual object type [OK]
Common Mistakes:
Expecting Derived.foo() to be called dynamically
Confusing extension with member function dispatch
Assuming runtime type affects extension resolution
4. Given the code below, what is the error and how to fix it?
open class Animal
class Dog : Animal()
fun Animal.sound() = "Some sound"
fun Dog.sound() = "Bark"
fun main() {
val animal: Animal = Dog()
println(animal.sound())
}
medium
A. No error; output is "Some sound"
B. Compilation error: extension functions cannot be overloaded
C. Runtime error: unresolved extension function
D. Output is "Bark" but should be "Some sound"
Solution
Step 1: Check for compilation errors
Extension functions can be overloaded by receiver type; no syntax error here.
Step 2: Understand output based on static resolution
Variable animal is declared as Animal, so animal.sound() calls Animal.sound(), outputting "Some sound".
Final Answer:
No error; output is "Some sound" -> Option A
Quick Check:
Extension resolved by declared type = Animal.sound() [OK]
Hint: Extensions overload by receiver type; call depends on variable type [OK]
Common Mistakes:
Expecting Dog.sound() to be called dynamically
Thinking extension functions cause runtime errors
Confusing extension overloading with overriding
5. You want to add an extension function describe() to a class hierarchy where Cat inherits from Animal. You want describe() to print "Animal description" when called on an Animal variable, and "Cat description" when called on a Cat variable. Given Kotlin's static resolution of extensions, how should you design your code to achieve this behavior?
hard
A. Declare two extension functions: one for Animal and one for Cat; call describe() on variables typed accordingly.
B. Override describe() as a member function in Cat and Animal classes.
C. Use a when expression inside a single extension function on Animal to check the runtime type.
D. Use reflection to call the correct extension function at runtime.
Solution
Step 1: Understand static resolution impact
Extension functions are chosen by variable type, so different extensions for Animal and Cat can coexist.
Step 2: Design with two extensions and variable types
Define describe() extensions for Animal and Cat separately, then call describe() on variables declared as Animal or Cat to get different outputs.
Final Answer:
Declare two extension functions: one for Animal and one for Cat; call describe() on variables typed accordingly. -> Option A
Quick Check:
Different extensions + variable types = desired output [OK]
Hint: Use separate extensions and variable types to get different outputs [OK]
Common Mistakes:
Trying to override extensions as member functions
Relying on runtime type for extension dispatch
Using reflection unnecessarily
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.