【问题标题】:Protected members not accessible in extension functions?扩展功能中无法访问受保护的成员?
【发布时间】:2015-11-22 07:55:38
【问题描述】:

Kotlin 有几个 visibility modifiersextension 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

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

【问题讨论】:

    标签: kotlin kotlin-extension


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 2013-06-08
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多