当前位置:嗨网首页>书籍在线阅读

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("扩展函数") }