编程Android 开发者

Kotlin 中的默认参数和命名参数是如何工作的?请谈谈与 Java 的区别,参数传递的细节,使用重载方法的编译,命名参数和位置参数的顺序。请给出示例。

用 Hintsage AI 助手通过面试

答案。

Kotlin 支持 默认值 (default arguments) 和 命名参数 (named parameters),这比 Java 提供了更大的灵活性。

主要要点:

  • 在 Kotlin 中,函数参数可以有默认值:
    fun greet(name: String = "User", greeting: String = "Hello") { println("$greeting, $name!") }
  • 你可以仅指定所需的参数来调用函数,其他的将使用默认值。
  • 命名参数 允许明确指定参数名 — 当函数有很多参数时,这特别方便:
    greet(greeting = "Привет") // -> Привет, User!
  • 可以组合使用常规(位置)参数和命名参数,只要命名参数不在调用的中间部分使用。
  • 与 Java 不同(Java 中会对每种组合进行重载),Kotlin 仅为与 Java 的互操作性编译默认参数为重载方法,而在 Kotlin 内部则不可见。

细节:

  • 在使用命名参数后,后续参数也必须是命名的。
  • 从 Java 使用带有默认参数的函数时,可能需要添加 @JvmOverloads 注解。

难题。

可以在 Kotlin 中以任何顺序混合位置参数和命名参数来调用函数吗?

正确答案: 不可以,一旦你指定了至少一个命名参数,所有后续的参数都必须是命名的。违规会导致编译错误。

// 错误 greet(greeting = "Hi", "Ivan") // 错误! // 正确 greet("Ivan", greeting = "Hi") greet(name = "Ivan", greeting = "Hi")

由于对主题细节缺乏了解而导致的实际错误示例。


故事

团队将 Kotlin 模块与遗留 Java 项目集成时忘记为默认参数函数添加 @JvmOverloads 注解。结果,Java 代码未能看到所需的重载方法 — 调用时出现运行时错误。


故事

在使用命名参数进行重构时,开发者不小心交换了参数顺序 — 在后续更改参数名称时未能注意到这一点(类型未破坏,但调用语义已改变!)。这导致 UI 逻辑中出现奇怪的错误,未能及时发现。


故事

一名开发者试图提高可读性,在调用中混合位置参数和命名参数。代码未能编译,但团队很难理解问题所在 — 因为在其他语言中经常遇到这种情况,并期望 Kotlin 也有类似行为。