什么? 在Kotlin中是否指派任务的左侧?

根据Kotlin文档 ,? 运算符表示“安全调用”,这意味着如果它在方法调用链中使用,则整个链将返回null(如果它使用的值为null)。

但是如果在作业的左侧使用它呢? 由于左侧不是“返回”任何一方,似乎可能有不同的效果。 这是我正在谈论的一个例子:

val myObj = SomeObj() myObj?.property = SomeClass.someFunc() // What does ?. do in this context? 

这意味着,如果左侧的一个安全调用失败(即其接收方为空),则整个分配将被跳过,而右侧的expression式根本不会被计算。

 val nullable: Container? = null nullable?.x = f() // f is not called 

(可运行演示)

我刚刚在Kotlin看到一个有趣的问题和答案。 即使答案是非常好的,但我想更详细地澄清它。

下面的赋值expression式:

 myObj?.property = SomeClass.someFunc() 

被Kolin转换为Java字节码如下:

 val it = myObj; if(it != null){ it.property = SomeClass.someFunc(); } 

所以在multithreading中没有问题。 它仍然正常工作,我已经在github上进行了测试。 但是它会导致线程干扰问题,这意味着当myObj被改变时它将修改不同引用的property

除了赋值expression式可以被短路 ,其他的也可以被短路 。 例如:

 val array:Array? = null; // v--- short-circuited array?.set(0,SomeClass.someFunc()); // ^--- never be called