优先级结论
调用对象 成员函数 > 调用对象 扩展函数 > 父类扩展函数;
测试用例
- 普通成员函数和扩展函数签名重复;成员函数 > 扩展函数
open class Parent {
open fun log4j() {
println("0000")
}
}
fun Parent.log4j() {
println("1111")
}
@Test
fun testFun() {
Parent().log4j() // print: 0000
}
- 子类成员函数和父类扩展函数签名重复;对象成员函数 > 对象扩展函数
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
}
- 子类复写父类函数,并与扩展函数签名重复;成员函数 > 父类成员函数 > 扩展函数
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
}
- 子类扩展函数和父类扩展函数签名重复;匹配调用对象的扩展函数
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
}