Kotlin verfügt über ein paar visibility modifiers sowie extension functions. Die Dokumentation besagt, dass Extensions are resolved statically
. Aber was bedeutet das für die Sichtbarkeit von Klassenmitgliedern innerhalb von Erweiterungsfunktionen?Geschützte Mitglieder in Erweiterungsfunktionen nicht erreichbar?
Nehmen wir folgende erfundene Beispiel betrachten:
class A { protected val a = "Foo" }
fun A.ext() { print(a) } //Raises: Cannot access 'a': it is 'protected' in 'A'
class B { val b = "Bar" }
fun B.ext() { print(b) } //Compiles successful
Der Code nicht kompiliert werden. Es scheint, dass auf geschützte Mitglieder beim Erweitern der Klasse nicht zugegriffen werden kann.
Das Gleiche gilt für statisch aufgelöst bedeuten die Erweiterungsfunktion so etwas wie dieses syntaktischer Zucker ist in Java für mit:
public static void ext(A receiver){ System.out.print(receiver.a); }
Dies würde erklären, warum geschützte Mitglieder nicht zugänglich sind. Auf der anderen Seite ist es möglich, this
in Erweiterungsfunktionen zu verwenden (und sogar wegzulassen).
Was ist der genaue Umfang der Erweiterungsfunktionen?