Kotlin 属性和奇怪的转换行为:java.lang.ClassCastException:android.text.SpannableStringBuilder 不能转换为 java.lang.String

Joe*_*oel 6 java android kotlin

Android Studio 催促我将 Kotlin 项目从 1.3.61 更新到 1.4.0 版,所以我这样做了,但后来我在标题中遇到了异常。我在带有 API 29 的模拟器中运行了代码。代码等效于以下内容:

    val tv : TextView = androidx.appcompat.widget.AppCompatEditText(applicationContext)
    tv.text = "Hello StackOverflow!"
    val s = tv.text.toString()
Run Code Online (Sandbox Code Playgroud)

而那个异常是由tv.text.toString(). 我觉得这很奇怪,因为它在更新之前就起作用了,据我所知,代码等效于tv.getText().toString(). 但是后者有效,而前者无效。

这也有效:

   val tv : TextView = androidx.appcompat.widget.AppCompatEditText(applicationContext)
   tv.setText("Hello StackOverflow!")
   val s = tv.text.toString()
Run Code Online (Sandbox Code Playgroud)

这也有效:

    val tv : TextView = androidx.appcompat.widget.AppCompatEditText(applicationContext)
    tv.text = "Hello StackOverflow!"
    val s = (tv.text as CharSequence).toString()
Run Code Online (Sandbox Code Playgroud)

这是正确的行为吗?如果是这样的话,如果有人能解释发生了什么,我将不胜感激。

所以总而言之,如果我使用 Kotlin 属性语法tv.text来设置和获取值,我会得到异常。如果我明确使用tv.getText()OR tv.setText(),它会起作用。tv.text如果我引入显式强制转换(我真的不明白为什么需要它,因为tv.text已经应该返回 a CharSequence),则可以使设置和获取值起作用。