Kotlin oferuje kilka z visibility modifiers, a także extension functions. Dokumentacja stwierdza, że Extensions are resolved statically
. Ale co to oznacza dla widoczności członków klasy w ramach funkcji rozszerzenia?Chronione elementy niedostępne w funkcjach rozszerzeń?
Rozważmy następujący przykład contrived:
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
Kod nie skompiluje. Wygląda na to, że chronieni członkowie nie są dostępni podczas rozszerzania klasy.
Więc nie rozwiązany statycznie znaczy funkcja rozszerzenie jest cukier syntaktyczny za posiadanie czegoś takiego w Javie:
public static void ext(A receiver){ System.out.print(receiver.a); }
To wyjaśniałoby, dlaczego członkowie chronione nie są dostępne. Z drugiej strony można używać (i nawet pomijać) funkcje rozszerzenia.
Jaki jest dokładny zakres funkcji rozszerzenia?