Kotlin 支持 默认值 (default arguments) 和 命名参数 (named parameters),这比 Java 提供了更大的灵活性。
fun greet(name: String = "User", greeting: String = "Hello") { println("$greeting, $name!") }
greet(greeting = "Привет") // -> Привет, User!
@JvmOverloads 注解。可以在 Kotlin 中以任何顺序混合位置参数和命名参数来调用函数吗?
正确答案: 不可以,一旦你指定了至少一个命名参数,所有后续的参数都必须是命名的。违规会导致编译错误。
// 错误 greet(greeting = "Hi", "Ivan") // 错误! // 正确 greet("Ivan", greeting = "Hi") greet(name = "Ivan", greeting = "Hi")
故事
团队将 Kotlin 模块与遗留 Java 项目集成时忘记为默认参数函数添加
@JvmOverloads注解。结果,Java 代码未能看到所需的重载方法 — 调用时出现运行时错误。
故事
在使用命名参数进行重构时,开发者不小心交换了参数顺序 — 在后续更改参数名称时未能注意到这一点(类型未破坏,但调用语义已改变!)。这导致 UI 逻辑中出现奇怪的错误,未能及时发现。
故事
一名开发者试图提高可读性,在调用中混合位置参数和命名参数。代码未能编译,但团队很难理解问题所在 — 因为在其他语言中经常遇到这种情况,并期望 Kotlin 也有类似行为。