我有一个功能:
object CliUtils {
var skipOptionalArgs = false
fun readOptional(variableName: String, defaultValue: String? = null): String? {
if (skipOptionalArgs) return defaultValue
print("Provide the $variableName (optional${if (defaultValue != null) ", default: $defaultValue" else ""}): ")
return readln().takeIf { it.isNotEmpty() } ?: defaultValue
}
}
当我像这样使用这个函数时...
val inputName = readOptional("input name", "Input")
...inputName
的类型是String?
.根据我给出的"Input"
的defaultValue
,我知道变量不是null
.
我可以使用双感叹号,如下所示:
val inputName = readOptional("input name", "Input")!!
但我觉得应该有一种方法来定义readOptional
函数,这样就可以推断出字符串的返回类型,而不使用双感叹号.我想到了合同,但对我的知识来说,合同只能引用参数,不能引用返回类型.我还想到了将defaultValue
参数类型的类型链接到返回类型的泛型,但我无法让它与其空性一起工作.
有没有办法让Kotlin明白,如果是defaultValue != null
,返回值也不是空的?