Kotlin带默认参数的重载方法疑问:如何指定foo(1)对应方法
解决Kotlin重载方法调用歧义的办法
嘿,这个场景我太熟悉了!Kotlin里这种带默认参数的重载方法,当你只传第一个参数时,编译器确实会犯难——因为两个方法都符合调用条件,没法自动判断你要选哪一个。不过有几个简单的办法能明确指定调用目标:
1. 显式传递对应类型的默认值
这是最直接的方式,通过传递参数的默认值帮编译器锁定重载:
- 如果想调用
fun foo(p1:Int,p2:String?=null):直接传null作为第二个参数就行,比如:
因为foo(1, null)null是String?的合法值,编译器会自动匹配到这个重载。 - 如果想调用
fun foo(p1:Int,p2:Int=0):显式传递0作为第二个参数,比如:foo(1, 0)
2. 使用命名参数明确匹配
命名参数能让代码可读性更强,同时帮编译器精准识别参数类型:
- 调用String版本:
foo(1, p2 = null) - 调用Int版本:
别人看代码时,一眼就能明白你选的是哪个重载。foo(1, p2 = 0)
3. 利用函数引用绑定指定重载
如果需要多次调用同一个重载,可以先绑定函数引用并指定类型,后续直接调用:
- 绑定String版本的函数:
val stringFoo: (Int, String?) -> Unit = ::foo stringFoo(1) // 自动使用p2的默认值null - 绑定Int版本的函数:
val intFoo: (Int, Int) -> Unit = ::foo intFoo(1) // 自动使用p2的默认值0
核心逻辑就是给编译器足够的类型信息,让它能区分两个重载的参数差异,避免调用歧义~
内容的提问来源于stack exchange,提问作者tysheng
相关产品推荐
相关产品推荐

