VI . 扩展函数 作用域 优先级 分析
本节讨论的是在不同包定义的相同函数签名的扩展函数调用问题
1 . 不同的包可以定义相同函数签名的扩展函数 : 在不同的包内 , 可以定义相同函数签名的扩展函数 , 调用时需要考虑各种情况 ; 其导入包的扩展函数优先级较高 , 没有发现导入包 , 才会去默认的本包中查找是否有定义该签名的扩展函数 ;
2 . 情况 一 : 在包内调用本包和外包的 相同签名的 扩展函数 ;
① 导入的包优先级高 : 如果导入外包扩展函数 , 就会调用外包的扩展函数 ;
② 本包默认优先级较低 : 如果没有导入 , 就会默认调用本包定义的的扩展函数 ;
3 . 情况 二 : 在一个包中调用 其它两个包 的 相同签名的 扩展函数 ;
① 调用优先级 : 导入哪个包 , 就调用哪个包的扩展函数 ;
② 重复导入 : 两个包都导入会报错 ;
VII . 扩展函数 作用域 优先级 代码示例分析
1 . 不同包中定义相同函数签名的扩展函数 : 为 Student 类在不同的包中定义相同函数签名的扩展函数 ;
① 在 extendbean 包定义了 Student.printNameAndAge() 扩展函数 :
package extendbean class Student { var name : String = "Tom" var age : Int = 18 } //定义扩展函数 fun Student.printNameAndAge(){ println("${this.name} , ${this.age}") }
② 在 extenddeclare 包也定义了相同函数签名的 Student.printNameAndAge() 扩展函数 :
package extenddeclare import extendbean.Student //定义扩展函数 fun Student.printNameAndAge(){ println("${this.name} , ${this.age}") }
2 . 在 extendbean 包中调用扩展函数分析 :
① 没有导入 extenddeclare.printNameAndAge 包 : 直接根据函数签名调用扩展函数 , 此时调用的是本包中定义的扩展函数 ;
extendbean : Tom , 18
package extendbean //使用 Student 的扩展 , 也需要导入 扩展函数所在包名.扩展函数名 //import extenddeclare.printNameAndAge //此处注释掉了导入包的操作 fun main() { var student : Student = Student() student.printNameAndAge() }
执行结果 : 根据结果可以看到 , 调用的是 extendbean 包中的扩展函数 ;
extendbean : Tom , 18
② 导入了 extenddeclare.printNameAndAge 包 :
package extendbean //使用 Student 的扩展 , 也需要导入 扩展函数所在包名.扩展函数名 import extenddeclare.printNameAndAge fun main() { var student : Student = Student() student.printNameAndAge() }
执行结果 : 根据结果可以看到 , 调用的是 extenddeclare 包中的扩展函数 ;
extenddeclare : Tom , 18
2 . 在 extendusage 包中调用扩展函数分析 : 这是个第三方包 , 分别在 extendbean 和 extenddeclare 定义了两个相同函数签名的 Student 扩展函数 ;
① 声明哪个包就调用对应包的方法 : 此时声明导入的是 extendbean.printNameAndAge , 就会调用 extendbean 包下的扩展函数 ;
package extendusage //使用到 Student 需要导入该类的包 import extendbean.Student import extendbean.printNameAndAge //import extenddeclare.printNameAndAge fun main() { var student : Student = Student() student.printNameAndAge() }
执行结果 :
extendbean : Tom , 18
② 如果都声明报错 : 如果两个包都声明 , 会如下错误 Overload resolution ambiguity. All these functions match. ;