如何在kotlin中使用elvis运算符时否定布尔表达式?

我想否定下面的表达式:

return SpUtils.loadEMail()?.isEmpty() ?: false

如果我添加一个! 之前的表情,像

return !SpUtils.loadEMail()?.isEmpty() ?: false

IDE(Android Studio)告诉我

在kotlin.Boolean类型的可为null的接收方中只允许使用安全(?)或非null断言(!!)调用?

我如何否定这种表情?

你有可空引用的问题。

  SpUtils.loadEMail()?.isEmpty() 

这段代码产生布尔类型的值? 这意味着表达式可以返回一个布尔实例或null

我建议下面的代码来解决你的问题:

 return !(SpUtils().loadEMail()?.isEmpty() ?: false); 

你试图否定布尔? 而不是布尔 , 猫王操作符返回!

?. 是一个安全的呼叫运营商 。

在这种情况下,它返回给你:

  • 如果loadEmail()调用的结果不为 nullloadEmail()布尔值
  • 否则为null

! 是一个内置的布尔操作,它调用package.Boolean的运算符not() ,它只能用于不可空的引用。 ?.的结果?.Boolean? ,所以你得到你的错误。

如果你想否定整个表达式,你可以坚持iRus的答案:

 !(SpUtils().loadEMail()?.isEmpty() ?: false) 

如果你只是否定了SpUtils().loadEMail()?.isEmpty()部分,那么正确的变体将是:

 !(SpUtils().loadEMail()?.isEmpty() ?: true) 

如果结果是?. 将是空的(没有邮件),那么猫王操作员将返回你的true (没有电子邮件),你会否定它。