【发布时间】:2019-09-03 07:34:16
【问题描述】:
我正在使用Kotlin,并考虑编写通用方法来检查是否有任何传递的参数是not null。
方法可以在if 语句中使用,而不是手动检查每个参数。如果参数不为空,那么编译器应该假设在if 语句中它们仍然是not null。示例如下:
fun getFoo(): Foo? {
//return value
}
fun getBar(): Bar? {
//return value
}
fun execute(foo: Foo, bar: Bar) {
//do stuff
}
这是“传统”方式:
val foo = getFoo()
val bar = getBar()
if(foo != null && bar != null) {
execute(foo, bar)
}
这就是我想做的:
fun isNotNull(vararg params: Any?): Boolean {
return params.filterNotNull().isNotEmpty()
}
val foo = getFoo()
val bar = getBar()
if(isNotNull(foo, bar)) {
execute(foo, bar)
}
当然上面的代码没有编译(Type mismatch, Required: Foo, Found: Foo?)。
有什么方法可以确保编译器已经检查了foo 和bar 的null?我可以在每个参数中使用!!,但这不是很优雅的解决方案。也许使用contract 进行一些构造?
当使用手动检查foo != null && bar != null时没有问题,因为自动smart cast到Foo和Bar。
【问题讨论】:
-
尤其是评分为 115 的回答
-
@Eugene 看起来很有趣,我会检查的!谢谢