kotlinkotlin-extensionkotlin-java-interop

How to shadow member function with a custom Kotlin extension function? (like Kotlin stdlib does)


I am reading Kotlin in Action 2nd edition.

Chapter 3 says:

If the class has a member function with the same signature as an extension function, the member function always takes precedence

At the same the book demonstrates the CharSequence.split Kotlin's stdlib extension function (which API is less confusing than an API of Java's String#split). The thing I do not understand is how this split extension functions takes precedence on the following call:

"12.345-6.A".split(".") // <-- Kotlin's extension function gets invoked here even though there is a member function on String class in Java with matching signature

The book also leaves the following comment on this case:

Kotlin hides the confusing method and provides as replacements several overloaded extensions named split that have different arguments

How does Kotlin hide a member function? Can I also shadow some member function which I do not like with my custom extension function? Or it is a trick which is only available to Kotlin language developers?


Solution

  • Actually Kotlin has a separate implementation of CharSequence and String.

    These kotlin String/Charsequence does not have its split function. Kotlin team has made all those string implementation functions separately with help of extension functions.Your string will be referring to kotlin String instead of Java String.

    If you need to create java String, you need to refer String with package like below.

    var str : java.lang.String = java.lang.String("a b c")
    str.split("")
    

    Here it will always call Java split function.

    Even if you create split function for java.lang.String , it will call only member function as you have read.

    member function always takes precedence