我正在尝试将我的 Android 项目切换到 Kotlin。我有一个 EditText
(TextView
的子类),我想以编程方式为其设置提示和文本。提示按预期工作。但是,对于文本,如果我尝试使用 Kotlin setter 语法进行操作,则会出现类型不匹配异常:
val test = EditText(context)
test.setHint("hint") // Lint message: "Use property access syntax"
test.hint = "hint" // ok
test.setText("text") // ok (no lint message)
test.text = "text" // Type mismatch: inferred type is kotlin.String but android.text.Editable! was expected
如果我们查看声明,我们会发现继承自 TextView
的相同签名:
public final void setHint(CharSequence hint)
public final void setText(CharSequence text)
我的印象是 x.y = z
是 x.setY(z)
的快捷方式,但显然这种印象是错误的。 setText()
被视为普通方法而不是setter,但是这两种方法有什么区别使编译器表现不同呢?我唯一能想到的是 TextView
有一个 mHint
属性,但我不认为可能是这种情况。
还有一点我不太明白的是,android.text.Editable
是从哪里来的?没有对应的setText(Editable)
方法,也没有这种类型的公共(public)字段。
最佳答案
在为 Java getter/setter 对生成合成属性时,Kotlin 首先查找 getter。 getter 足以创建具有 getter 类型的合成属性。另一方面,如果只有 setter 存在,则不会创建该属性。
当 setter 出现时,属性创建变得更加困难。原因是 getter 和 setter 可能有不同的类型。此外,getter 和/或 setter 可以在子类中被覆盖。
在您的情况下,TextView
类包含一个 getter CharSequence getText()
和一个 setter void setText(CharSequence)
。如果你有一个 TextView
类型的变量,你的代码就可以正常工作。但是你有一个 EditText
类型的变量。并且 EditText
类包含一个重写的 getter Editable getText()
,这意味着您可以为 EditText获取一个
类。Editable
code> 并将 Editable
设置为 EditText
。因此,Kotlin 合理地创建了 Editable
类型的合成属性 text
。 String
类不是 Editable
,这就是为什么不能将 String
实例分配给 text
属性的原因code>EditText
关于android - Kotlin 属性访问语法如何适用于 Java 类(即 EditText setText)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37374075/