I metodi che seguono le convenzioni Java per getter e setter (metodi senza argomento con nomi che iniziano con get e metodi con argomento singolo con nomi che iniziano con set) sono rappresentati come proprietà in Kotlin. Ma, mentre genera una proprietà per una coppia getter / setter Java, Kotlin inizialmente cerca un getter. Il getter è sufficiente per dedurre il tipo di proprietà dal tipo di getter. D'altra parte, la proprietà non verrà creata se è presente solo un setter (poiché Kotlin non supporta al momento proprietà solo set).
Quando entra in gioco un setter, il processo di generazione della proprietà diventa un po 'ambiguo. Il motivo è che il getter e il setter possono avere tipi diversi. Inoltre, il getter e / o il setter possono essere sovrascritti in una sottoclasse, che è esattamente il caso di EditText in Android.
Nel caso precedente, la classe TextView di Android contiene un getter
CharSequence getText()
e un setter vuoto
setText(CharSequence)
Se avessi avuto una variabile di tipo TextView il mio codice avrebbe funzionato bene. Ma ho usato la classe EditText che contiene un getter sovrascritto
Editable getText()
ciò significa che è possibile ottenere un modificabile per un EditText e impostare un modificabile su un EditText. Pertanto, Kotlin crea ragionevolmente un testo di proprietà sintetica di tipo modificabile. Poiché la classe String non è modificabile, ecco perché non posso assegnare un'istanza String alla proprietà text della classe EditText.
Sembra che JetBrains abbia dimenticato di specificare il ruolo dominante dei metodi getter durante la generazione di proprietà kotlin per i metodi getter e setter Java. Ad ogni modo, ho inviato una richiesta pull al sito Web di Jet Brains Kotlin tramite github.
Ho dettagliato il problema sopra in questo post medio Come fa Kotlin a generare proprietà da Getter e setter Java (non documentato da Jetbrains)