我试着去理解下面的情节。
inline fun Any?.what(ifNotNull: (Any) -> Unit, ifNull: () -> Unit) {
if (this == null) {
ifNull()
} else {
ifNotNull(this)
}
}
@OptIn(ExperimentalContracts::class)
@JvmSynthetic
inline fun <T> T?.whatIfNull(
whatIfNot: (T) -> Unit,
whatIf: () -> Unit,
) {
contract {
callsInPlace(whatIf, InvocationKind.AT_MOST_ONCE)
callsInPlace(whatIfNot, InvocationKind.AT_MOST_ONCE)
}
if (this != null) {
whatIfNot(this)
} else {
whatIf()
}
}
fun main() {
null?.what(
ifNull = {
println("It Works!")
},
ifNotNull = {
println("It not working!!")
},
)
null?.whatIfNull(
whatIf = {
println("It Works!")
},
whatIfNot = {
println("It not working!!")
},
)
}
当我编译这段代码时,我得到了类似于main
的东西。
public static final void main() { }
当我移除null
后面的?
操作符时,比如null.whatIfNull(
将得到
public static final void main() {
Object $this$whatIfNull$iv = null;
int $i$f$whatIfNull = false;
int var2 = false;
String var3 = "It Works!";
System.out.println(var3);
}
我也在试着理解这一点。看起来它只是在删除?
之后才编译的。
这个问题的原因可能是什么?有没有具体的博客或文章?请发表评论,或请解释我。谢谢。
1条答案
按热度按时间3j86kqsm1#
问题是当你写
null?.<anythinghere>
的时候,它已经知道<anythinghere>
是不可达的,所以它就把它忽略了。你可能认为null?
是Any?
的值,但是它不是。所以它不匹配。考虑下面的代码:输出将为:
在编写
null?
时,您有第一种情况的示例,这意味着它永远不会执行它后面的任何内容。