当前位置: 首页 > 知识库问答 >
问题:

使用不可为null的默认参数向Kotlin方法传递null值

伊飞光
2023-03-14

我是静态编程语言的新手,我发现静态编程语言不同于Java的特性之一是方法默认参数。https://kotlinlang.org/docs/functions.html#default-arguments

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

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 })
}

一种解决方法是将方法参数更改为nullable,但会丢失原始方法的干净性。

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。我想知道是否还有其他更好的替代方案。

共有1个答案

丌官昊天
2023-03-14

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

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)
}
 类似资料: