2015-11-22 12 views
5

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?

Antwort

6

Sie sind richtig, Erweiterungsfunktionen/Eigenschaften werden zu statischen JVM-Methoden kompiliert. Im Allgemeinen befinden sie sich in einer anderen Klasse in einem anderen Paket als der Klasse, die sie erweitern. Daher ist es nicht möglich, geschützte Methoden dieser Klasse aufgrund von VM-Zugriffsregeln aufzurufen. Es ist auch konsistent mit der protected Sichtbarkeit definition (sichtbar in der Klasse und seinen Unterklassen): Eine Erweiterungsfunktion ist keine Unterklasse, noch ist sie in einer Unterklasse der Klasse definiert, die Sie erweitern.

Die Tatsache, dass Sie this im Rumpf einer Erweiterungsfunktion verwenden oder weglassen können, ist nur eine syntaktische Funktion, der Compiler gibt die erforderlichen Anweisungen aus, stattdessen den ersten Parameter der JVM-Methode zu laden.

Verwandte Themen