受保护的成员在扩展功能中无法访问?

And*_*ann 7 kotlin kotlin-extension

Kotlin具有几个可见性修饰符扩展功能.文件说明了这一点Extensions are resolved statically.但这对扩展函数中类成员的可见性意味着什么呢?

让我们考虑以下人为的例子:

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
Run Code Online (Sandbox Code Playgroud)

代码不会编译.在扩展类时似乎无法访问受保护的成员.

因此,解决静态意味着扩展函数是在Java中具有类似内容的语法糖:

public static void ext(A receiver){ System.out.print(receiver.a); }
Run Code Online (Sandbox Code Playgroud)

这可以解释为什么受保护的成员无法访问.另一方面,可以this在扩展函数中使用(甚至省略).

那么扩展功能的确切范围是什么?

Ale*_*lov 9

您是对的,扩展函数/属性被编译为静态JVM方法.通常它们位于其他包中的另一个类而不是它们扩展的类中,因此由于VM可访问性规则而无法调用该类的受保护方法.它也与protected可见性定义(在类及其子类中可见)一致:扩展函数不是子类,也不是在您要扩展的类的子类中定义.

您可以this在扩展函数体中使用或省略的事实只是一个语法特性,编译器会发出所需的指令来加载JVM方法的第一个参数.