Kotlin 函数调用优先级

417 阅读1分钟

优先级结论

调用对象 成员函数 > 调用对象 扩展函数 > 父类扩展函数;

测试用例

  1. 普通成员函数和扩展函数签名重复;成员函数 > 扩展函数
open class Parent {
    open fun log4j() {
        println("0000")
    }
}

fun Parent.log4j() {
    println("1111")
}

@Test
fun testFun() {
    Parent().log4j() // print: 0000
}
  1. 子类成员函数和父类扩展函数签名重复;对象成员函数 > 对象扩展函数
open class Parent {

}

open class Child : Parent() {
    fun log4j() {
        println("2222")
    }
}

fun Parent.log4j() {
    println("1111")
}

@Test
fun testFun() {
    Child().log4j() // print: 2222
    (Child() as Parent).log4j() // print: 1111
}
  1. 子类复写父类函数,并与扩展函数签名重复;成员函数 > 父类成员函数 > 扩展函数
open class Parent {
    open fun log4j() {
        println("0000")
    }
}

open class Child : Parent() {
    override fun log4j() {
        println("2222")
    }
}

fun Parent.log4j() {
    println("1111")
}

@Test
fun testFun() {
    Child().log4j() // print: 2222
    (Child() as Parent).log4j() // print: 2222
}
  1. 子类扩展函数和父类扩展函数签名重复;匹配调用对象的扩展函数
open class Parent {}
open class Child {}

fun Parent.log4j() {
    println("1111")
}

fun Child.log4j() {
    println("4444")
}

@Test
fun testFun() {
    Child().log4j() // print: 4444
    Parent.log4j() // print: 1111
}