Kotlin属性访问语法如何为Java类(即EditText setText)工作?
我试图将我的Android项目切换到Kotlin。 我有一个EditText
( TextView
的子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 = z
是x.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()
,这意味着你可以获得一个EditText
的Editable
,并将一个Editable
设置为一个EditText
。 因此,Kotlin合理地创建了一个Editable
类型的综合属性text
。 String
类不是Editable
,这就是为什么你不能将一个String
实例赋给EditText
类的text
属性。
android.text.Editable
来自getText()
。 在我看来,Kotlin中的obj.text = value
分辨率是2步过程。
- 编译器试图找到一个
text
属性或Java方法getText
,从中推断出属性类型 - 对于推断的属性类型,编译器会尝试查找相应的属性设置器或Java方法
setText(PropertyType value)
由于在1.推断类型是Editable
的editText.text = "value"
失败与Type mismatch
错误。
为了避免类型不匹配,可以使用Editable类的Factory内部类。 所以你现在可以做一些事情:
textview.text = Editable.Factory.getInstance().newEditable("your text")
- Kotlin属性:“属性的类型参数必须在其接收器类型中使用”
- compileReleaseKotlin失败,java.lang.ClassNotFoundException:com.sun.tools.javac.util.Context
- 会话cookie不会与JSoup保持一致
- 如何使用kotlin创建在构造函数中传递方法引用的generics类的实例
- Android仅为Edittext禁用空间
- 是否有可能在Android项目中运行最新版本的Akka Framework(2.5.2)?
- 滚动时,片段内容隐藏在BottomNavigationView后面
- 当运行测试android嘲笑时,在视图中的空指针
- 针对构造函数中注入次数的Lint规则