遵循getter和setter的Java约定的方法(名称以get开头的无参数方法和名称以set开头的单参数方法)在Kotlin中表示为属性。但是,在为Java getter / setter对生成属性时,Kotlin首先会寻找getter。吸气剂足以从吸气剂的类型推断出属性的类型。另一方面,如果仅存在setter,则不会创建该属性(因为Kotlin目前不支持set-only属性)。
当二传手开始发挥作用时,属性生成过程会变得有些模棱两可。原因是getter和setter的类型可能不同。此外,getter和/或setter可能会在子类中被覆盖,这正是android中EditText的情况。
在上述情况下,Android TextView类包含一个吸气剂
CharSequence getText()
和二传手无效
setText(CharSequence)
如果我有一个TextView类型的变量,我的代码会正常工作。但是我使用了EditText类,其中包含一个覆盖的getter
Editable getText()
这意味着您可以获得EditText的Editable并将Editable设置为EditText。因此,Kotlin合理地创建了Editable类型的合成属性文本。由于String类不可编辑,因此无法将String实例分配给EditText类的text属性。
似乎JetBrains忘记了指定getter方法的主导作用,而为Java getter和setter方法生成kotlin属性。无论如何,我已经通过github向Jet brains kotlin网站提交了pull请求。
我也在此中等职位中详细介绍了上述问题,Kotlin如何从Java Getters和Setters生成属性(Jetbrains未记录)