kotlin - 扩展功能中无法访问 protected 成员?

标签 kotlin kotlin-extension

Kotlin 有几个 visibility modifiers以及 extension functions .文档指出扩展是静态解析的。但这对于扩展函数中类成员的可见性意味着什么?

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

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

代码不会编译。扩展类时似乎无法访问 protected 成员。

静态解析是否意味着扩展函数是在 Java 中具有类似功能的语法糖:

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

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

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

最佳答案

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

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

关于kotlin - 扩展功能中无法访问 protected 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33852770/

相关文章:

android - RecyclerView 未绑定(bind)数据 notifyDataSetChanged 在过滤数据时不起作用

java - 更改 Spring Boot/Netty 中的错误日志记录

generics - Out-projected 类型 'ArrayList<*>' 禁止使用 'public open fun add(index: Int, element: E): Unit defined in java.util.ArrayList'

Kotlin 扩展方法作为长方法名称的别名?

android - Kotlin中带有对象的列表的深拷贝

Kotlin 成员和扩展同时使用

android - 使用 setGraph() 以编程方式设置图形会导致应用程序无法在进程终止后恢复堆栈(Jetpack 导航)

java - Dagger2 错误 : Kotlin: Unresolved reference: DaggerSOMETHINGComponent

android - Kotlin 的 @Parcelize 在 writeToParcel() 上抛出 NPE

java - 如何在android中创建我自己的com.google.android.gms.tasks.Task?