【问题标题】:Passing null value to Kotlin method with non nullable default arguments使用不可为空的默认参数将空值传递给 Kotlin 方法
【发布时间】:2021-05-16 22:46:19
【问题描述】:

我是 Kotlin 的新手,我发现 Kotlin 与 Java 不同的特性之一是方法默认参数。 https://kotlinlang.org/docs/functions.html#default-arguments

我正在创建一个简单的 Kotlin 应用程序,它将空值传递给具有 2 个不可为空的默认参数的方法,这会导致编译错误 - 类型不匹配:推断类型是字符串?但字符串是预期的)

fun greet(firstName: String = "Hello", lastName: String = "world") {
    println("${firstName} ${lastName}")
}

fun main(args: Array<String>) {
    greet(args.getOrElse(0) { null }, args.getOrElse(1) { null })
}

一种解决方法是将方法参数更改为可为空,但原始方法的清洁度会丢失。

fun greet(firstName: String?, lastName: String?) {
    val firstName2 = firstName ?: "Hello"
    val lastName2 = lastName ?: "world"
    println("${firstName2} ${lastName2}")
}

fun main(args: Array<String>) {
    greet(args.getOrElse(0) { null }, args.getOrElse(1) { null })
}

如果我必须保留原始方法签名,我可以考虑以下替代解决方案。

复制方法签名和方法调用者中的默认参数定义

fun greet(firstName: String = "Hello", lastName: String = "world") {
    println("${firstName} ${lastName}")
}

fun main(args: Array<String>) {
    greet(args.getOrElse(0) { "Hello" }, args.getOrElse(1) { "world" })
}

根据参数数量单独调用方法

fun greet(firstName: String = "Hello", lastName: String = "world") {
    println("${firstName} ${lastName}")
}

fun main(args: Array<String>) {
    when (args.size) {
        0 -> greet()
        1 -> greet(args[0])
        2 -> greet(args[0], args[1])
    }
}

当没有提供参数时,所有 3 个解决方案都会打印 Hello world。我想知道是否还有其他更好的替代解决方案。

【问题讨论】:

  • greet 上使用默认参数的用例是什么?您想在什么时候根据默认值调用它?
  • 这只是一个示例。可能还有其他情况需要多个带有默认值的可选参数,例如buildApplication、constructObject等
  • 嗯,我认为这取决于情况。 Kotlin 不是很教条,并且有多种做事方式——所以我不确定这个问题是否有明确的答案。我个人喜欢你的第三个选项。

标签: kotlin


【解决方案1】:

与其使用默认参数,不如明确并验证您的输入,这样可以避免歧义:

fun greet(firstName: String, lastName: String) = println("$firstName $lastName")

fun main(args: Array<String>) {
    require(args.size == 2) { "Must supply two arguments" }
    val (arg1, arg2) = args
    greet(arg1, arg2)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    相关资源
    最近更新 更多