我是静态编程语言的新手,我发现静态编程语言不同于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。我想知道是否还有其他更好的替代方案。
与其使用默认参数,不如明确并验证您的输入,这样您就可以避免歧义:
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)
}
我在行得到异常。怎么会呢?这到底是怎么回事? 这是我的密码。 堆栈跟踪
在JavaScript中,有没有一种方法可以将可选参数传递到函数中,如果它不是null的话?否则,根本不要传递此参数。 例如下面的函数,如果var_c为null,如何不插入c参数
我目前正在尝试将我的Firebase数据库中的内容读入中,但我希望将它们从最后一个节点加载到第一个节点。所以我决定将键放入一个数组中,然后尝试从数组的末尾读到前面,但是当我尝试访问键数组时,我看到的是中的参数'path string'传递null错误。
问题内容: 是否可以将此代码转换为Java 8可选单行表达式? 即如果某个对象不为空,我需要调用一个对象方法并返回其结果,否则返回0。 不适合,因为它返回相同类型的对象,但是我需要方法调用的结果或一些默认值。 问题答案: 几种形式: 其中,最后一个不使用Optional(因此不能严格回答您的问题!)更易于阅读,运行时开销也较小,因此应优先使用。 可以说,如果您反转选项,它甚至更简单: …尽管您可能
我得到这个错误 为了那条线 以下是整个代码。这段代码最初是在java中,我使用Android Studio将其转换为静态编程语言,但现在我得到了这个错误。我试图重建和清理这个项目,但没有成功。