【Kotlin】扩展函数作用域分析 ( 扩展函数导入 | 扩展函数重载 | 扩展函数作用域优先级 )(二)

简介: 【Kotlin】扩展函数作用域分析 ( 扩展函数导入 | 扩展函数重载 | 扩展函数作用域优先级 )(二)

VI . 扩展函数 作用域 优先级 分析


本节讨论的是在不同包定义的相同函数签名的扩展函数调用问题



1 . 不同的包可以定义相同函数签名的扩展函数 : 在不同的包内 , 可以定义相同函数签名的扩展函数 , 调用时需要考虑各种情况 ; 其导入包的扩展函数优先级较高 , 没有发现导入包 , 才会去默认的本包中查找是否有定义该签名的扩展函数 ;



2 . 情况 一 : 在包内调用本包和外包的 相同签名的 扩展函数 ;


① 导入的包优先级高 : 如果导入外包扩展函数 , 就会调用外包的扩展函数 ;


② 本包默认优先级较低 : 如果没有导入 , 就会默认调用本包定义的的扩展函数 ;



3 . 情况 二 : 在一个包中调用 其它两个包 的 相同签名的 扩展函数 ;


① 调用优先级 : 导入哪个包 , 就调用哪个包的扩展函数 ;


② 重复导入 : 两个包都导入会报错 ;


image.png




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. ;


image.png

目录
相关文章
|
1天前
|
Kotlin
Kotlin - 高阶函数与函数引用
Kotlin - 高阶函数与函数引用
11 3
Kotlin - 高阶函数与函数引用
|
1天前
|
安全 Kotlin
Kotlin - 作用域函数
Kotlin - 作用域函数
9 3
|
3天前
|
IDE 开发工具 Kotlin
Kotlin - 函数与Lambda表达式
Kotlin - 函数与Lambda表达式
|
5天前
|
IDE 开发工具 Kotlin
Kotlin教程笔记(6) - 函数与Lambda表达式
Kotlin教程笔记(6) - 函数与Lambda表达式
21 4
|
4天前
|
Java Kotlin Python
​ Kotlin教程笔记(16) - 扩展成员
​ Kotlin教程笔记(16) - 扩展成员
12 0
​ Kotlin教程笔记(16) - 扩展成员
|
6天前
|
Java Kotlin Python
Kotlin教程笔记(16) - 扩展成员
Kotlin教程笔记(16) - 扩展成员
15 0
Kotlin教程笔记(16) - 扩展成员
|
7天前
|
Kotlin
Kotlin教程笔记(21) -高阶函数与函数引用
本系列教程详细讲解Kotlin语法,适合深入学习。若需快速入门,请查阅“简洁”系列教程。本文重点介绍高阶函数与函数引用,包括函数类型、函数引用、成员方法引用及函数类型实例调用等内容。
18 1
|
2天前
|
IDE 开发工具 Kotlin
Kotlin - 函数与Lambda表达式
Kotlin - 函数与Lambda表达式
14 0
|
24天前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
17 1
|
2月前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
72 1