07-静态解析
6.2.3 静态解析
扩展函数是静态解析的,并不是接收者类型的虚拟成员,在调用扩展函数时,具体被调用的是哪一个函数,由调用函数的对象表达式来决定,而不是由动态的类型决定。代码如下。
fun main(arg:Array<String>){
printFoo(D()) //输出c
}
open class C
class D: C()
fun C.foo() = "c" // 扩展foo()
fun D.foo() = "d" // 扩展foo()
fun printFoo(c: C) {
println(c.foo())
}
在上面的例子中,调用的扩展函数取决于参数c的声明类型,该声明类型为C类,如果调用的是D类,则输出为d。
如果一个类同时定义了成员函数和扩展函数,而且成员函数和扩展函数具有相同的名字和接收者类型,则使用该类的函数时优先使用成员函数。代码如下。
fun main(arg:Array<String>){
var c = C()
c.foo() //成员函数
}
class C {
fun foo() { println("成员函数") }
}
fun C.foo() { println("扩展函数") }
当然,扩展函数带有参数也是可以的,代码如下。
class C {
fun foo() { println("成员函数") }
}
fun C.foo(i: Int) { println("扩展函数") }