我正在尝试将我的 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字段。
原文由 SqueezyMo 发布,翻译遵循 CC BY-SA 4.0 许可协议
当为 Java getter/setter 对生成合成属性时,Kotlin 首先查找 getter。 getter 足以创建具有 getter 类型的合成属性。另一方面,如果只有 setter 存在,则不会创建该属性。
当二传手上场时,财产创造变得更加困难。原因是 getter 和 setter 可能有不同的类型。此外,getter 和/或setter 可以在子类中被覆盖。
在您的情况下,
TextView
类包含一个 getterCharSequence getText()
和一个 settervoid setText(CharSequence)
。如果您有一个类型为TextView
的变量,您的代码就可以正常工作。但是您有一个类型为EditText
的变量。 And theEditText
class contains an overridden getterEditable getText()
, which means that you can get anEditable
for anEditText
and set anEditable
到EditText
。因此,Kotlin 合理地创建了一个类型为 — 的合成属性text
Editable
。 TheString
class is notEditable
, that’s why you cannot assign aString
instance to thetext
property of theEditText
上课。