Как работает синтаксис доступа к свойствам Kotlin для классов Java (например, EditText setText)?

Я пытаюсь переключить свой Android-проект на Kotlin. У меня есть EditText (подкласс TextView ), для которого я хочу установить подсказку и текст программно. Подсказка работает так, как ожидалось. Тем не менее, для текста я получаю исключение несоответствия типа, если я пытаюсь сделать это, используя синтаксис сеттера Kotlin:

  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() рассматривается как обычный метод, а не сеттер, но в чем разница между этими двумя методами, которые заставляют компилятор вести себя по-другому? Единственный, о котором я могу думать, это то, что TextView обладает свойством mHint но я не думаю, что это может быть так.

Еще одна вещь, которую я не совсем понимаю, – откуда взялся android.text.Editable ? Не существует соответствующего метода setText(Editable) , также нет публичного поля этого типа.

Благодарю.

При генерации синтетического свойства пары Java getter / setter Kotlin сначала ищет геттер. Геттера достаточно, чтобы создать синтетическое свойство с типом геттера. С другой стороны, свойство не будет создано, если будет представлен только сеттер.

Когда сеттер входит в игру, создание собственности становится более сложным. Причина в том, что геттер и сеттер могут иметь различный тип. Более того, геттер и / или сеттер могут быть переопределены в подклассе.

В вашем случае класс TextView содержит getter CharSequence getText() и setter void setText(CharSequence) . Если бы у вас была переменная типа TextView ваш код будет работать нормально. Но у вас есть переменная типа EditText . И класс EditText содержит переопределенный getter Editable getText() , что означает, что вы можете получить Editable для EditText и установить Editable в EditText . Поэтому Котлин разумно создает синтетический text свойства типа Editable . Класс String не Editable , поэтому вы не можете назначить экземпляр String для свойства text класса EditText .

getText() android.text.Editable поступает из getText() . Мне кажется, что решение obj.text = value в Котлине является двухэтапным процессом.

  1. Компилятор пытается найти свойство text или метод getText Java, из которого он указывает тип свойства
  2. Для типа свойства inferred компилятор пытается найти соответствующий набор свойств или метод Java setText(PropertyType value)

Так как в 1. выведенный тип Editable editText.text = "value" терпит неудачу с ошибкой Type mismatch .

Чтобы избежать несоответствия типов, вы можете использовать внутренний класс Factory класса Editable. Итак, теперь вы можете сделать что-то вроде:

 textview.text = Editable.Factory.getInstance().newEditable("your text") 
Intereting Posts
Вопрос о намерениях в приложении для Android от java до kotlin Kotlin: Как заменить уже открытый фрагмент на новый фрагмент в студии Android? Как получить завершение кода IntelliJ IDEA для импорта статических методов Java в качестве функций верхнего уровня Kotlin? Котлин показал несоответствие типов в фрагменте Область применения верхнего уровня Kotlin Запечатанный класс безопасности типа для заявлений – kotlin Текст ярлыка не обновляется, хотя поток пользовательского интерфейса кажется отзывчивым Kotlin addTextChangeListener lambda? Работает ли KAnnotator в Android Studio? Kotlin Неразрешенная ссылка: println от gradle на CLI Kotlin Деятельность, не включенная в APK Не удается получить dokka для генерации котлинских документов по проекту gradle / android Есть ли чистый способ использования методов расширения Groovy в Котлине? Вызов функции Java с vararg, не компилируемым в Котлине kotlin неразрешенная ссылка KDoc, но IntelliJ не любит импорт, который его исправляет