假设我有以下类:
为什么我会收到错误消息“智能转换为'String'是不可能的,因为'username'是一个可变属性,可能已经被更改了”?
这是否与线程安全有关?
根据null safety docs,我认为以下两种情况之一应该可以解决此问题:1. 在使用它们作为参数之前,在同一个函数中设置
class MyClass {
private var username: String? = null
private var projectName: String? = null
private var buildNumber: Int = -1
private val presenter: Presenter = Presenter()
fun present() {
username = ""
projectName = ""
if (username != null && projectName != null && buildNumber != -1) {
presenter.viewReady(this, username, projectName, buildNumber)
} else {
throw Exception("You did something bad!")
}
}
}
为什么我会收到错误消息“智能转换为'String'是不可能的,因为'username'是一个可变属性,可能已经被更改了”?
这是否与线程安全有关?
根据null safety docs,我认为以下两种情况之一应该可以解决此问题:1. 在使用它们作为参数之前,在同一个函数中设置
username
和projectName
,2. 将它们用作参数时,将其包装在检查其值的if语句中。
username?.let {}
,其中内部的it
将是非空类型,因为let
保留了它被调用时的值,忽略了实际变量的任何修改。但是,在此嵌套执行此操作并不美观。 - zsmb13presenter.viewReady(this, username!!, projectName!!, buildNumber)
。 - voddan!!
会在以后导致难以调试的问题。 - F. George!!
是解决问题的正确方式,我会在我的答案中证明它。 - voddan