Kotlin 在扩展函数中无法访问受保护的成员?

Kotlin 在扩展函数中无法访问受保护的成员?,kotlin,kotlin-extension,Kotlin,Kotlin Extension,Kotlin的特点是有两个和两个。文档说明,扩展是静态解析的。但是这对于扩展函数中类成员的可见性意味着什么呢 我们考虑下面的设计例子: 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 succ

Kotlin的特点是有两个和两个。文档说明,
扩展是静态解析的
。但是这对于扩展函数中类成员的可见性意味着什么呢

我们考虑下面的设计例子:

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); }
这可以解释为什么受保护的成员无法访问。另一方面,可以在扩展函数中使用(甚至省略)
这个


那么扩展函数的确切范围是什么呢?

没错,扩展函数/属性被编译为静态JVM方法。一般来说,它们位于它们扩展的类之外的其他包中的另一个类中,因此由于VM可访问性规则,不可能调用该类的受保护方法。它还与受保护的可见性(在类及其子类中可见)一致:扩展函数不是子类,也不是在要扩展的类的子类中定义的

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