方法過載(Overloads)
當一個類中有兩個或多個具有相同方法名和不同的引數型別的方法時,就是過載:
class Person { fun say() { println("hahaha") } fun say(what: String) { println(what) } fun say(obj: Any) { println("this is ${obj.javaClass.simpleName}") }}fun main() { val person = Person() person.say() // hahaha person.say("hehehe") // hehehe person.say(person) // this is Person}
方法簽名由方法名和引數型別決定,與方法的其他屬性無關。
預設引數在 Kotlin 中,方法可以使用預設引數,一般情況下,方法過載可以轉換成帶預設引數的方法:
class Person { fun say(what: String = "hahaha") { println(what) } fun say(obj: Any) { println("this is ${obj.javaClass.simpleName}") }}fun main() { val person = Person() person.say() // hahaha person.say("hehehe") // hehehe person.say(person) // this is Person}
可以看到這裡只是把 say() 和 say(what:String) 使用預設引數整合了,但 say(obj:Any) 還在,其實 say(obj:Any) 的設計是不合理的,因為 String 是 Any 的子類,在呼叫方法時會有歧義,開發中,最好避免這種寫法。
JvmOverloads現在 Person 類中的 say()是過載方法,而且其中一個 say 有預設引數,我們來看看在 Java 中呼叫如何:
可以發現,Java 中識別不到不帶引數的 say()方法,這是因為 Java 並不知道 Kotlin 中有預設引數這種特性,它只能認為 say(what:String) 和 say(obj:Any) 是過載方法,把 say(what:String) 中的預設引數給忽略了,Kotlin 提供了 @JvmOverloads 可以將帶有預設引數的方法轉換成對應的過載方法:
class Person { @JvmOverloads fun say(what: String = "hahaha") { println(what) } fun say(obj: Any) { println("this is ${obj.javaClass.simpleName}") }}
ok,這下 Java 中就識別到了不帶引數的 say()方法了
最新評論