android - Kotlin 属性访问语法如何适用于 Java 类(即 EditText set

我正在尝试将我的 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 = zx.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 类型的合成属性 textString 类不是 Editable,这就是为什么不能将 String 实例分配给 text 属性的原因code>EditText 类。

关于android - Kotlin 属性访问语法如何适用于 Java 类(即 EditText setText)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37374075/

相关文章:

types - Kotlin:从列表(或其他功能转换)中消除空值

android - 如何通过 kotlin 中的 Intent 传递自定义对象

android - 在 ConstraintLayout 中使用 group 来监听多个 View

lambda - 在 lambda 中使用 return?

kotlin - 从 java 中调用作为 java 中关键字的 kotlin 函数?

android - 在 Kotlin 中将接口(interface)作为参数传递

kotlin - 比较字符串 Kotlin

enums - 如何在 Kotlin 中声明枚举类型的变量?

android - "Extension with name ' android ' does no

intellij-idea - Kotlin - IntelliJ 项目设置