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
代码不会编译。扩展类时似乎无法访问受保护的成员。
静态解析是否意味着扩展函数是在 Java 中具有类似功能的语法糖:
public static void ext(A receiver){ System.out.print(receiver.a); }
这可以解释为什么受保护的成员不可访问。另一方面,可以this
在扩展函数中使用(甚至省略)。
那么扩展函数的具体范围是什么?