【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

目录
相关文章
|
8月前
|
API Kotlin
Kotlin中扩展函数、infix关键字、apply函数和DSL的详解
Kotlin中扩展函数、infix关键字、apply函数和DSL的详解
75 0
|
8月前
|
安全 Java Kotlin
Kotlin中空安全操作符,异常处理和自定义异常,以及先决条件函数详解
Kotlin中空安全操作符,异常处理和自定义异常,以及先决条件函数详解
84 0
|
4月前
|
数据采集 JSON 安全
简明指南:使用Kotlin和Fuel库构建JD.com分析
Kotlin是一门基于JVM的静态类型编程语言,以其简洁、高效、安全、跨平台等特点而著称。这门语言不仅适用于Android开发,还可用于服务器端和Web应用程序的开发。Fuel库作为一款轻量级的Kotlin HTTP客户端,提供了一套简洁易用的DSL(领域特定语言),使得发送HTTP请求和处理响应变得异常便捷。除此之外,Fuel还支持协程、异步操作、JSON处理以及文件上传等多种功能,以满足各种网络编程需求。
简明指南:使用Kotlin和Fuel库构建JD.com分析
|
6月前
|
存储 Java 编译器
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(下)
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(下)
32 0
|
6月前
|
Java Android开发 开发者
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(上)
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(上)
44 0
|
8月前
|
安全 Java 编译器
Kotlin 学习笔记(一)—— 基本类型、函数、lambda、类与对象的写法
Kotlin 作为 Android 开发的首选语言,其基础语法和特性需要重点学习。本文概括总结了 Kotlin 的基本类型、关键字、函数、闭包、高阶函数、类与对象等核心知识点,并给出示例代码进行讲解。
150 0
Kotlin 学习笔记(一)—— 基本类型、函数、lambda、类与对象的写法
|
8月前
|
Java Kotlin
Kotlin中与Java互操作与可空性、类型映射、属性访问、@JvmOverloads、@JvmField、@JvmStatic、@Throws和函数类型操作详解
Kotlin中与Java互操作与可空性、类型映射、属性访问、@JvmOverloads、@JvmField、@JvmStatic、@Throws和函数类型操作详解
68 0
|
16天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
17天前
|
数据库 Android开发 开发者
构建高效Android应用:Kotlin协程的实践指南
【4月更文挑战第2天】随着移动应用开发的不断进步,开发者们寻求更流畅、高效的用户体验。在Android平台上,Kotlin语言凭借其简洁性和功能性赢得了开发社区的广泛支持。特别是Kotlin协程,作为一种轻量级的并发处理方案,使得异步编程变得更加简单和直观。本文将深入探讨Kotlin协程的核心概念、使用场景以及如何将其应用于Android开发中,以提高应用性能和响应能力。通过实际案例分析,我们将展示协程如何简化复杂任务,优化资源管理,并为最终用户提供更加流畅的体验。
|
26天前
|
调度 数据库 Android开发
构建高效Android应用:Kotlin协程的实践与优化
在Android开发领域,Kotlin以其简洁的语法和平台友好性成为了开发的首选语言。其中,Kotlin协程作为处理异步任务的强大工具,它通过提供轻量级的线程管理机制,使得开发者能够在不阻塞主线程的情况下执行后台任务,从而提升应用性能和用户体验。本文将深入探讨Kotlin协程的核心概念,并通过实例演示如何在实际的Android应用中有效地使用协程进行网络请求、数据库操作以及UI的流畅更新。同时,我们还将讨论协程的调试技巧和常见问题的解决方法,以帮助开发者避免常见的陷阱,构建更加健壮和高效的Android应用。
35 4