Kotlin属性访问语法如何为Java类(即EditText setText)工作?

我试图将我的Android项目切换到Kotlin。 我有一个EditTextTextView的子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) 

我有一个印象, xy = zx.setY(z)的快捷方式,但显然这种印象是错误的。 setText()被视为一个普通的方法而不是一个setter,但是这两种方法之间的区别是什么,使编译器的行为有所不同? 唯一我能想到的是TextView有一个mHint属性,但我不认为它可能是这种情况。

另一件我不太明白的地方是, android.text.Editable从哪里来? 没有相应的setText(Editable)方法,也没有这种类型的公共字段。

谢谢。

为Java getter / setter对生成合成属性时Kotlin首先查找getter。 吸气剂就足以用吸气剂的类型创造一个合成的属性。 另一方面,如果只有二传手出现,财产将不会被创造。

当二传手进场时,财产创造变得更加困难。 原因是吸气剂和吸气剂可能有不同的类型。 而且,吸气剂和/或吸气剂可以在子类中被覆盖。

在你的情况下, TextView类包含一个getter CharSequence getText()和一个setter void setText(CharSequence) 。 如果你有一个TextView类型的变量,你的代码可以正常工作。 但是你有一个EditText类型的变量。 EditText类包含一个重写的getter Editable getText() ,这意味着你可以获得一个EditTextEditable ,并将一个Editable设置为一个EditText 。 因此,Kotlin合理地创建了一个Editable类型的综合属性textString类不是Editable ,这就是为什么你不能将一个String实例赋给EditText类的text属性。

android.text.Editable来自getText() 。 在我看来,Kotlin中的obj.text = value分辨率是2步过程。

  1. 编译器试图找到一个text属性或Java方法getText ,从中推断出属性类型
  2. 对于推断的属性类型,编译器会尝试查找相应的属性设置器或Java方法setText(PropertyType value)

由于在1.推断类型是EditableeditText.text = "value"失败与Type mismatch错误。

为了避免类型不匹配,可以使用Editable类的Factory内部类。 所以你现在可以做一些事情:

 textview.text = Editable.Factory.getInstance().newEditable("your text")