You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中内部类继承外部类时访问外部类实例的方法

解决Kotlin内部类中访问外部子类实例的问题

首先得理清这里的this指向误区:你之前认为this@A指向B继承的父类A实例,其实这是混淆了内部类的外部实例和子类的父类实例的区别。

在你的代码结构里:

  • B是A的inner类,所以每个B实例都会持有一个外部A类的引用(也就是创建它的那个A子类实例,这里就是Parent)
  • 同时B又继承了A,所以B自身也是A的子类实例

Kotlin中用this@类名来区分不同上下文的this:

  • this(或this@B):指向当前B(也就是Child)的实例
  • this@A:指向B作为内部类时的外部A实例,也就是你要找的Parent对象
  • 如果要访问B继承的父类A的成员/实例,应该用super(比如super.toString()会调用A的默认toString)

所以修改测试代码,把this替换成this@A就能实现需求:

abstract class A {
    abstract inner class B : A() {
        init {
            println("Should display 'Parent': ${this@A}") // 替换为this@A
        }
    }
}

class Parent : A() {
    override fun toString() = "Parent"
    inner class Child() : B() {
        override fun toString() = "Child"
    }
}

fun main() {
    Parent().Child()
}

运行这段代码会输出:Should display 'Parent': Parent,完全符合预期。

为什么这个写法有效?因为Child是Parent的内部类,当你创建Parent().Child()时,Child实例的外部Parent实例会被传递给它所继承的B类,而B作为A的内部类,this@A就指向这个外部的Parent实例,又因为Parent重写了toString()方法,所以会打印出Parent。


内容的提问来源于stack exchange,提问作者CLOVIS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 15:34:09