Kotlin提供了几个visibility modifiers以及extension functions。文档指出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
代码无法编译。在扩展课程时似乎无法访问受保护的成员。
解析静态意味着扩展函数是在Java中具有类似内容的语法糖:
public static void ext(A receiver){ System.out.print(receiver.a); }
这可以解释为什么受保护的成员无法访问。另一方面,它可以在扩展函数中使用(甚至省略)this
。
那么扩展函数的确切范围是什么?
答案 0 :(得分:8)
您是对的,扩展函数/属性被编译为静态JVM方法。通常,它们位于除了它们正在扩展的类之外的其他一些包中的另一个类中,因此由于VM可访问性规则而无法调用该类的受保护方法。它也与protected
可见性definition一致(在类及其子类中可见):扩展函数不是子类,也不是在类的子类中定义的&# 39;重新延伸。
您可以在扩展函数体中使用或省略this
只是一个语法特性,编译器会发出所需的指令来加载JVM方法的第一个参数。