Функция расширения может делать только то, что может делать не-расширение fun ext(x: A.B)
, поэтому я ожидаю, что нет, точно так же, как , вы не можете получить к ней доступ в Java .Это потому, что он компилируется в такую функцию, синтаксис просто делает его похожим на член.
Хотя класс B
имеет поле, содержащее ссылку на внешний экземпляр A
, это поле не можетбыть доступным непосредственно из кода по имени.Разрешение доступа к нему будет нарушать инкапсуляцию .
На связанной странице говорится о «доступе [ing] this
из внешней области».«Scope» здесь используется в смысле https://en.wikipedia.org/wiki/Scope_(computer_science),, поэтому в примере у вас есть области действия, где в комментариях говорится «неявная метка»
class A { // outer scope 1
inner class B { // outer scope 2
fun Int.foo() { // function scope
}
}
}
, а
fun A.B.ext() = ...
не имеет внешних областей (кроме области видимости файла, которая не имеет this
).Если это действительно
class C {
fun A.B.ext() = // can use this@C
}
, но вы не можете написать this@A
или, если на то пошло, this@B
, поскольку функция не определена в области class A
или class B
.