我如何从一个内部类访问外部范围时,我为它创建的扩展功能?
例
class A {
inner class B {
fun own() = this@A
}
}
此代码编译和它应该执行。
当我添加下面的扩展功能
fun A.B.ext() = this@A
编译失败
Error:(7, 22) Kotlin: Unresolved reference: @A
我读qualified this的文档,它简略的提到的扩展功能,但没有任何例子。
是否有可能从扩展函数访问外部范围是什么?
扩展函数只能做的事情非扩展fun ext(x: A.B)
可以做的,所以我希望不会,就像you can't access it in Java。这是因为它编译成这样的功能,语法只是使它看起来像一个成员。
虽然类B
具有包含于外A
实例的引用一个字段,该字段不能直接从代码通过名称访问。允许访问将violate encapsulation。
关于“获得[和]外部范围this
”所链接的页面会谈。 “范围”这里是https://en.wikipedia.org/wiki/Scope_(computer_science)的意义上使用,因此在本例中,你有范围,其中评论说:“隐式标签”
class A { // outer scope 1
inner class B { // outer scope 2
fun Int.foo() { // function scope
}
}
}
而
fun A.B.ext() = ...
不具有任何外部范围(除文件范围,其不具有this
)。除非它真的
class C {
fun A.B.ext() = // can use this@C
}
但由于功能不this@A
或this@B
的范围定义,你可以不写class A
或为此事class B
。