What if you could teach built-in types new tricks without changing their original code?
Why Extensions on built-in types in Kotlin? - Purpose & Use Cases
Imagine you want to add a new feature to a String or List in Kotlin, like checking if a string is a palindrome or summing only positive numbers in a list. Without extensions, you'd have to create helper functions or new classes, and always pass the original object as a parameter.
This manual way is slow and clunky. You lose the natural feel of calling the feature directly on the object. It's easy to forget to pass the object or mix up parameters. Your code becomes messy and harder to read, like trying to use a screwdriver as a hammer.
Extensions on built-in types let you add new functions or properties directly to existing classes like String or List, without changing their original code. This means you can call your new features as if they were part of the original type, making your code cleaner, easier to read, and more natural.
fun isPalindrome(str: String): Boolean {
return str == str.reversed()
}
val result = isPalindrome("level")fun String.isPalindrome(): Boolean {
return this == this.reversed()
}
val result = "level".isPalindrome()You can write code that feels like the language itself understands your needs, making your programs more expressive and easier to maintain.
Suppose you work with dates often. Instead of writing separate functions, you add an extension to the Date class to format dates exactly how you want, then call it directly on any Date object.
Manual helper functions can be awkward and error-prone.
Extensions let you add new features directly to existing types.
This makes your code cleaner, more readable, and natural to use.
Practice
Solution
Step 1: Understand extension functions concept
Extension functions allow adding new functions to existing types without changing their original code.Step 2: Compare options with concept
Only To add new functions to existing types without modifying their source code correctly describes this purpose. Options B and C talk about inheritance and overriding, which are different concepts. To convert one type to another automatically is unrelated.Final Answer:
To add new functions to existing types without modifying their source code -> Option BQuick Check:
Extension functions add new behavior without changing original code [OK]
- Confusing extension functions with inheritance
- Thinking extensions override existing methods
- Believing extensions convert types automatically
isEven for Int in Kotlin?Solution
Step 1: Recall extension function syntax
Extension functions are declared asfun TypeName.functionName(). Here,Int.isEven()is correct.Step 2: Check each option
fun Int.isEven(): Boolean { return this % 2 == 0 } matches the correct syntax. fun isEven(): Boolean { return this % 2 == 0 } misses the receiver type. fun Int.isEven: Boolean = this % 2 == 0 misses parentheses. fun isEven(Int): Boolean = Int % 2 == 0 has wrong parameter syntax.Final Answer:
fun Int.isEven(): Boolean { return this % 2 == 0 } -> Option AQuick Check:
Extension syntax = fun TypeName.functionName() [OK]
- Omitting the receiver type before function name
- Missing parentheses after function name
- Using parameter instead of receiver for extension
fun String.addExclamation() = this + "!"
fun main() {
val word = "Hello"
println(word.addExclamation())
}Solution
Step 1: Understand the extension function behavior
The extension functionaddExclamationadds an exclamation mark to the string.Step 2: Trace the main function output
Callingword.addExclamation()returns "Hello!" which is printed.Final Answer:
Hello! -> Option DQuick Check:
Extension adds "!" so output is "Hello!" [OK]
- Expecting original string unchanged
- Thinking extension adds multiple exclamations
- Assuming syntax error due to extension
fun Int.isPositive {
return this > 0
}Solution
Step 1: Check function declaration syntax
Extension functions must have parentheses after the function name, even if no parameters.Step 2: Identify the fix
Add parentheses:fun Int.isPositive(). Other options are incorrect because Boolean return is allowed, Int is valid receiver, and return statements are allowed.Final Answer:
Missing parentheses after function name; should be fun Int.isPositive() -> Option AQuick Check:
Extension functions need () after name [OK]
- Omitting parentheses after function name
- Thinking extensions can't return values
- Confusing receiver type validity
wordCount for String that returns the number of words separated by spaces. Which implementation correctly handles multiple spaces and empty strings?Solution
Step 1: Understand the problem requirements
We need to count words separated by spaces, ignoring extra spaces and empty strings.Step 2: Analyze each option
fun String.wordCount() = this.split(" ").size splits by space but counts empty strings if multiple spaces exist. fun String.wordCount() = this.trim().split(" ").filter { it.isNotEmpty() }.size trims, splits, filters out empty strings, then counts, correctly handling multiple spaces and empty strings. fun String.wordCount() = this.length returns string length, unrelated. fun String.wordCount() = this.count { it == ' ' } counts spaces, not words.Final Answer:
fun String.wordCount() = this.trim().split(" ").filter { it.isNotEmpty() }.size -> Option CQuick Check:
Trim, split, filter empty = correct word count [OK]
- Counting empty strings as words
- Using string length instead of word count
- Counting spaces instead of words
Ready to prove it?
Pass the test and this pattern moves unknown
