Methoden, die den Java-Konventionen für Getter und Setter folgen (Methoden ohne Argumente mit Namen, die mit get beginnen, und Methoden mit einem Argument, deren Namen mit set beginnen), werden in Kotlin als Eigenschaften dargestellt. Beim Generieren einer Eigenschaft für ein Java-Getter / Setter-Paar sucht Kotlin zunächst nach einem Getter. Der Getter reicht aus, um den Typ der Eigenschaft aus dem Typ des Getters abzuleiten. Auf der anderen Seite wird die Eigenschaft nicht erstellt, wenn nur ein Setter vorhanden ist (da Kotlin derzeit keine Nur-Satz-Eigenschaften unterstützt).
Wenn ein Setter ins Spiel kommt, wird der Prozess der Eigenschaftsgenerierung etwas mehrdeutig. Der Grund ist, dass der Getter und der Setter unterschiedliche Typen haben können. Darüber hinaus können der Getter und / oder der Setter in einer Unterklasse überschrieben werden, was genau bei EditText in Android der Fall ist.
Im obigen Fall enthält die Android TextView-Klasse einen Getter
CharSequence getText()
und ein Setter nichtig
setText(CharSequence)
Wenn ich eine Variable vom Typ TextView hätte, hätte mein Code gut funktioniert. Aber ich habe die EditText-Klasse verwendet, die einen überschriebenen Getter enthält
Editable getText()
Dies bedeutet, dass Sie eine Bearbeitbarkeit für einen EditText erhalten und eine Bearbeitbarkeit für einen EditText festlegen können. Daher erstellt Kotlin vernünftigerweise einen synthetischen Eigenschaftstext vom Typ Editable. Da die String-Klasse nicht bearbeitbar ist, kann ich der text-Eigenschaft der EditText-Klasse keine String-Instanz zuweisen.
Es scheint, als hätte JetBrains vergessen, die dominierende Rolle von Getter-Methoden beim Generieren von Kotlin-Eigenschaften für Java-Getter- und Setter-Methoden anzugeben. Wie auch immer, ich habe über github eine Pull-Anfrage an die Website von Jet Brains Kotlin gesendet.
Ich habe das obige Problem auch in diesem mittleren Beitrag ausführlich beschrieben. Wie generiert Kotlin Eigenschaften aus Java-Gettern und -Setzern (undokumentiert von Jetbrains)?