Metody, które są zgodne z konwencjami języka Java dla metod pobierających i ustawiających (metody bezargumentowe o nazwach zaczynających się od get i metody jednoargumentowe o nazwach zaczynających się od set) są reprezentowane jako właściwości w Kotlinie. Jednak podczas generowania właściwości dla pary pobierającej / ustawiającej Javy Kotlin najpierw szuka metody pobierającej. Metoda pobierająca jest wystarczająca, aby wywnioskować typ właściwości na podstawie typu metody pobierającej. Z drugiej strony właściwość nie zostanie utworzona, jeśli obecny jest tylko ustawiający (ponieważ Kotlin nie obsługuje obecnie właściwości tylko zestawu).
Kiedy w grę wchodzi ustawiacz, proces generowania nieruchomości staje się nieco niejednoznaczny. Powodem jest to, że metoda pobierająca i ustawiająca mogą mieć różne typy. Co więcej, metoda pobierająca i / lub ustawiająca może zostać zastąpiona w podklasie, co dokładnie ma miejsce w przypadku EditText w systemie Android.
W powyższym przypadku klasa Android TextView zawiera metodę pobierającą
CharSequence getText()
i seter próżnia
setText(CharSequence)
Gdybym miał zmienną typu TextView, mój kod działałby dobrze. Ale użyłem klasy EditText, która zawiera nadpisany getter
Editable getText()
co oznacza, że możesz uzyskać Editable dla EditText i ustawić Editable na EditText. Dlatego Kotlin rozsądnie tworzy syntetyczny tekst właściwości typu Edytowalny. Ponieważ klasy String nie można edytować, nie mogę przypisać instancji String do właściwości text klasy EditText.
Wygląda na to, że JetBrains zapomniał określić dominującą rolę metod pobierających podczas generowania właściwości kotlin dla metod pobierających i ustawiających w języku Java. Tak czy inaczej, wysłałem prośbę o ściągnięcie do strony Jet Brains kotlin przez github.
Szczegółowo opisałem powyższy problem w tym średnim poście. Jak Kotlin generuje właściwość z Java Getters i Setters (nieudokumentowane przez Jetbrains)