Kotlin 有几个 visibility modifiers以及 extension functions .文档指出扩展是静态解析的
。但这对于扩展函数中类成员的可见性意味着什么?
让我们考虑以下人为的例子:
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
代码不会编译。扩展类时似乎无法访问 protected 成员。
静态解析是否意味着扩展函数是在 Java 中具有类似功能的语法糖:
public static void ext(A receiver){ System.out.print(receiver.a); }
这可以解释为什么 protected 成员无法访问。另一方面,可以在扩展函数中使用(甚至省略)this
。
那么扩展函数的具体范围是什么?
最佳答案
你是对的,扩展函数/属性被编译为静态 JVM 方法。通常,它们位于其他包中的另一个类中,而不是它们正在扩展的类,因此由于 VM 可访问性规则,无法调用该类的 protected 方法。它也与 protected
可见性 definition 一致(在类及其子类中可见):扩展函数不是子类,也不是在您要扩展的类的子类中定义。
您可以在扩展函数的主体中使用或省略 this
的事实只是一个语法特性,编译器会发出所需的指令来加载 JVM 方法的第一个参数。
关于kotlin - 扩展功能中无法访问 protected 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33852770/