Bird
Raised Fist0
Kotlinprogramming~5 mins

Extensions vs member functions priority in Kotlin

Choose your learning style10 modes available
Introduction
Sometimes you add new functions to existing classes without changing them. Kotlin lets you do this with extensions. But if a class already has a function with the same name, Kotlin uses the class's own function first.
You want to add a new function to a class you don't own or can't change.
You want to keep your code organized by adding helpers outside the class.
You want to avoid accidentally overriding existing class functions.
You want to understand why your extension function is not called when a member function exists.
Syntax
Kotlin
fun ClassName.extensionFunction() {
    // code here
}

// Member function inside the class
class ClassName {
    fun memberFunction() {
        // code here
    }
}
Extension functions are declared outside the class but look like member functions when called.
If a member function and an extension function have the same name and parameters, the member function is called.
Examples
The member function greet() is called because it has priority over the extension function.
Kotlin
class Example {
    fun greet() = "Hello from member"
}

fun Example.greet() = "Hello from extension"

fun main() {
    val e = Example()
    println(e.greet())
}
Since Example has no greet member function, the extension function greet() is called.
Kotlin
class Example {
    // No greet function here
}

fun Example.greet() = "Hello from extension"

fun main() {
    val e = Example()
    println(e.greet())
}
Sample Program
The Person class has a member function sayHello(). Even though there is an extension function with the same name, the member function is called because it has higher priority.
Kotlin
class Person(val name: String) {
    fun sayHello() = "Hello from member: $name"
}

fun Person.sayHello() = "Hello from extension: $name"

fun main() {
    val p = Person("Alice")
    println(p.sayHello())
}
OutputSuccess
Important Notes
Extension functions do not actually modify the class; they are static functions with receiver.
If you want to call the extension function when a member function exists, you must use a different name.
Extensions cannot override member functions.
Summary
Kotlin calls member functions before extension functions when names clash.
Extensions add new functions without changing the original class.
Use extensions to add helpers, but remember member functions have priority.

Practice

(1/5)
1. In Kotlin, when a class has a member function and an extension function with the same name, which one is called by default?
easy
A. The member function of the class
B. The extension function
C. Both are called
D. It causes a compile-time error

Solution

  1. Step 1: Understand member vs extension functions

    Member functions are defined inside the class, while extension functions are defined outside to add functionality.
  2. Step 2: Check Kotlin's call priority

    Kotlin always prefers member functions over extension functions when both have the same name.
  3. Final Answer:

    The member function of the class -> Option A
  4. Quick Check:

    Member functions have priority = A [OK]
Hint: Member functions override extensions with same name [OK]
Common Mistakes:
  • Thinking extension functions override member functions
  • Assuming both functions run together
  • Believing it causes a compile error
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

  1. Step 1: Recall extension function syntax

    Extension functions are declared as fun ClassName.functionName().
  2. Step 2: Match syntax with options

    fun Person.greet() { println("Hello") } matches the correct syntax: fun Person.greet().
  3. Final Answer:

    fun Person.greet() { println("Hello") } -> Option D
  4. Quick Check:

    Extension syntax = D [OK]
Hint: Extension syntax: fun ClassName.functionName() [OK]
Common Mistakes:
  • Placing function name before class name
  • Using 'extension' keyword incorrectly
  • Wrong function declaration order
3. Consider the following Kotlin code:
class Box {
    fun size() = "Member size"
}

fun Box.size() = "Extension size"

fun main() {
    val box = Box()
    println(box.size())
}

What is the output when this code runs?
medium
A. Compilation error
B. Member size
C. Extension size
D. Runtime exception

Solution

  1. Step 1: Identify member and extension functions

    Class Box has a member function size() returning "Member size". An extension function with the same name returns "Extension size".
  2. Step 2: Determine which function is called

    Kotlin calls the member function when both exist, so box.size() calls the member function.
  3. Final Answer:

    Member size -> Option B
  4. Quick Check:

    Member function called over extension = C [OK]
Hint: Member function called if name clashes [OK]
Common Mistakes:
  • Expecting extension function output
  • Thinking both outputs print
  • Assuming compile error due to name clash
4. Given this Kotlin code:
class Gadget {
    fun info() = "Member info"
}

fun Gadget.info() = "Extension info"

fun main() {
    val g: Gadget? = null
    println(g?.info())
}

What is the output when running this code?
medium
A. null
B. Member info
C. Extension info
D. NullPointerException

Solution

  1. Step 1: Analyze nullable variable and safe call

    Variable g is null. The safe call operator ?. prevents calling functions on null.
  2. Step 2: Understand safe call with extension/member functions

    Since g is null, g?.info() returns null without calling any function.
  3. Final Answer:

    null -> Option A
  4. Quick Check:

    Safe call on null returns null = B [OK]
Hint: Safe call on null returns null, no function called [OK]
Common Mistakes:
  • Expecting function output despite null
  • Thinking NullPointerException occurs
  • Confusing extension and member call on null
5. You want to add a describe() function to class Device without modifying its source code. The class already has a member function describe(). How can you call the extension describe() function explicitly in Kotlin?
hard
A. You cannot call the extension if member exists with same name
B. Use (device as Device).describe() to call extension
C. Call extension with a wrapper function or different name
D. Use Device::describe.invoke(device) to call extension

Solution

  1. Step 1: Understand member vs extension call priority

    Kotlin always calls member functions over extensions if names clash; extension cannot override member.
  2. Step 2: Find workaround to call extension

    To call extension explicitly, rename it or call via a wrapper function with a different name.
  3. Final Answer:

    Call extension with a wrapper function or different name -> Option C
  4. Quick Check:

    Rename or wrap extension to call it = A [OK]
Hint: Rename extension or wrap it to call when member exists [OK]
Common Mistakes:
  • Trying to cast to call extension directly
  • Expecting extension to override member
  • Using reflection incorrectly to call extension
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard