我的问题几乎像这个问题Java: calling outer class method in anonymous inner class一样。 但是这次我们在科特林。
如下面的示例所示,我想在对象表达式中调用funB()
,但是我只发生了两次失败。
class A {
lateinit var funA: () -> Unit
lateinit var funB: () -> Unit
fun funC() {
var b = object : B() {
override fun funB() {
funA() // A.funA()
// Two attempts to fail
funB() // b.funB(), not my expect
A::funB() // compile error
}
}
}
}
谢谢您的回答!
答案 0 :(得分:5)
您可以用@限定this
以获得与Java等效的值:MyClass.this
-> this@MyClass
然后,您可以致电:
this@A.funB()
从doc:
要从外部范围(类,扩展功能或带有接收方的带标签的函数文字)访问此标签,我们编写this @ label,其中@label是该范围的标签,其含义是:
class A { // implicit label @A
inner class B { // implicit label @B
fun Int.foo() { // implicit label @foo
val a = this@A // A's this
val b = this@B // B's this
val c = this // foo()'s receiver, an Int
val c1 = this@foo // foo()'s receiver, an Int
val funLit = lambda@ fun String.() {
val d = this // funLit's receiver
}
val funLit2 = { s: String ->
// foo()'s receiver, since enclosing lambda expression
// doesn't have any receiver
val d1 = this
}
}
}
}