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

Protected members not accessible in extension functions?

Kotlin 有几个 visibility modifiers as well as extension functions。文档指出 Extensions are resolved statically。但这对于 class 成员在扩展函数中的可见性意味着什么?

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

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

代码无法编译。似乎在扩展 class.

时无法访问受保护的成员

静态解析也是如此意味着扩展函数是语法糖,因为在Java中有这样的东西:

public static void ext(A receiver){ System.out.print(receiver.a); }

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

那么扩展函数的具体范围是什么?

你是对的,扩展 functions/properties 被编译为静态 JVM 方法。一般来说,它们位于另一个 class 中,而不是它们正在扩展的 class 中的其他包中,因此由于 VM 可访问性规则,不可能调用 class 的受保护方法。它也符合 protected 可见性 definition(在 class 及其子 class 中可见):扩展函数不是子 class,也不是它是在您要扩展的 class 的子 class 中定义的吗?

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