解决Kotlin错误:Smart cast is impossible, because the property could have been changed by this time

时间:2022-06-01 20:38:49

使用Kotlin开发Android应用,在向列表添加Nullable值时Android Studio提示:

Smart cast to 'String' is impossible, because 'a.name' is a mutable property that could have been changed by this time

示例如下

class A {
  var name: String? = null
}

class B {
  val names: ArrayList<String> = ArrayList()
  public fun addNames(a: A) {
      if(a.name != null) {
          names.add(a.name);
      }
  }
}

查了一下,报这个错误的原因是:在别的线程可以对Nullable值a.name做修改,这样在执行names.add(a.name)时它的值有可能为null。

解决

为了避免添加null值,有几种做法:

1、使用val声明nullable值,这样nullable值就不可能被修改

class A {
  val name: String? = null
}

2、把nullable值赋值给一个新的变量,然后再做其他操作

public fun addNames(a: A) {
  val name = a.name
  if(name != null) {
     names.add(name);
  }
}

3、使用?let语法糖

a.name?.let { name -> names.add(name) }
a.name?.let { names.add(it) }
a.name?.let(names::add)