What are extension functions and what are their limitations?
An extension function adds a method to a class without modifying or inheriting it. Resolution is static.
fun String.toTitleCase(): String =
split(" ").joinToString(" ") { word ->
word.replaceFirstChar { it.uppercase() }
}
"hello world".toTitleCase() // "Hello World"
Extensions are syntactic sugar for a static function whose first parameter is the receiver. They do not truly add members, which has consequences:
- They cannot access
privateorprotectedmembers. - They are not virtual: dispatch is based on the declared static type, not the runtime type, so an extension can be shadowed unexpectedly.
- A real member with the same signature always wins.
- Extension properties cannot store state because there is no backing field.
Common uses are utility functions, Android view helpers and DSL builders like buildString and apply. Keep them in dedicated files so they do not become a dumping ground.