请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术交流,必有回复!

疯狂Java联盟

 找回密码
 加入联盟
查看: 807|回复: 0

[Android] Kotlin函数重载

[复制链接]
发表于 2017-11-25 11:20:27 | 显示全部楼层 |阅读模式
本帖最后由 kongyeeku 于 2018-2-1 23:21 编辑

本文节选自《疯狂Kotlin讲义》
与Java类似,Kotlin允许定义多个同名函数,只要形参列表或返回值类型不同就行。如果程序包含了两个或两个以上函数名相同,但形参列表不同的函数,就被称为函数重载。
与Java类似的是,Kotlin的函数重载也只能通过形参列表可进行区分,形参个数不同、形参类型不同都可以算重载。但仅有形参名不同不能算函数重载,返回值类型不同也不能算函数重载,修饰符不同也不能算函数重载。
下面程序中包含了函数重载的示例。
程序清单:codes\06\6.3\OverloadTest.kt
// 下面定义了3test()函数,但函数的形参列表不同
// 系统可以区分它们,这被称为函数重载
fun test() {
         println("无参数的test()函数")
}
// 该函数类型为(String): Unit
funtest(msg:String) {
         println("重载的test()函数${msg}")
}
// 该函数类型为(Int): String
funtest(msg: Int): String {
         println("重载的test()函数${msg},带返回值")
         return"test"
}
fun main(args: Array<String>){
         // 调用test()时没有传入参数,因此系统调用上面没有参数的test()函数
         test()
         // 调用带String参数的test()函数
         test("fkjava")
         // 调用带Int参数的test()函数,该函数返回字符串
         varrt = test(30)
         println(rt)
}
编译、运行上面程序完全正常,上面3个test()函数的函数名虽然相同,但因为它们的形参列表不同,所以系统可以正常区分它们。
如果被重载的函数里包含了个数可变的形参,则尤其需要注意。看下面程序里定义的两个重载的函数。
程序清单:codes\06\6.3\OverloadVarargs.kt
fun test(msg: String) {
         println("只有一个字符串参数的test()函数 ${msg}")
}
// 因为前面已经有了带一个字符串参数的test()函数
// 此处的个数可变形参又可以包含带一个字符串参数的形式
fun test(vararg books: String) {
         println("****形参个数可变的test()函数****${books.contentToString()}")
}
fun main(args: Array<String>) {
         // 下面两次调用将执行第二个test()函数
         test()
         test("aa", "bb")
         test("aa")  //
}
编译、运行上面程序,将看到test()和test("aa" , "bb")两次调用的都是test(books:String...)函数。
对于①号代码:test("aa"),这行代码才会调用test(msg:String)函数,这意味着虽然这行代码既可匹配test(String)函数,也可匹配test(varargs String)函数,但Kotlin会尽量执行最精确的匹配,因此Kotlin会将这样调用匹配test(String)函数。
提示:大部分时候并不推荐重载形参个数可变的函数,因为这样做确实没有太大的意义,而且容易导致错误。
您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

视频、代码、电子书下载
请关注"疯狂图书"公众号
QQ交流1群: 545923995  未满
微信群请扫二维码
QQ交流1群:
545923995
(未满)

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11094030号 )

GMT+8, 2019-5-22 18:39 , Processed in 0.272358 second(s), 6 queries , File On.

快速回复 返回顶部 返回列表