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

如何在Kotlin中创建作为内部类的匿名类实例

问题分析与解决方案

你的实现不可行,核心问题有两点:

  1. 你代码中尝试引用的outerIsSuper.Inner()不存在——OuterIsSuper类内部并没有定义名为Inner的嵌套/内部类。
  2. 即使是要继承现有内部类创建匿名对象,也需要遵循Kotlin内部类的实例化规则,同时确保目标类是可继承的(即open修饰)。

先明确你的类结构问题

你定义的Outer类中包含两个内部类:

  • OuterIsNotSuper:open修饰的内部类,可被继承
  • OuterIsSuper:默认final的内部类,不可被继承,同时它继承了外部类Outer

正确的语法示例

根据你的需求,分两种常见场景给出正确写法:

场景1:创建OuterIsNotSuper的匿名子类对象

因为OuterIsNotSuper是open的,且是内部类(依赖外部Outer实例),写法如下:

// 先创建外部类Outer的实例
val outerInstance = Outer(2)
// 基于外部实例创建内部类的匿名子类对象
val anonymousInner = object : outerInstance.OuterIsNotSuper() {
    // 可选:重写父类方法或添加自定义逻辑
    override fun getValue(): Int {
        return super.getValue() * 2
    }
}

场景2:创建OuterIsSuper的匿名子类对象

首先需要修改OuterIsSuper为open类(默认类是final,无法被继承):

open class Outer(protected val value: Int) {
    open inner class OuterIsNotSuper {
        fun getValue(): Int {
            return value
        }
    }
    // 添加open修饰,允许被继承
    open inner class OuterIsSuper(i: Int) : Outer(i) {}
}

然后基于外部Outer实例创建其匿名子类对象:

val outerInstance = Outer(2)
// 传入OuterIsSuper构造需要的参数,创建匿名子类对象
val anonymousOuterIsSuper = object : outerInstance.OuterIsSuper(3) {
    // 可选:添加自定义逻辑,比如重写父类属性或方法
}

补充说明

Kotlin的inner类必须依赖外部类的实例才能实例化,因此创建内部类的对象(包括匿名类)时,必须通过外部类的实例来引用内部类。如果不需要持有外部类引用,可以将内部类改为嵌套类(去掉inner修饰符),此时可以直接通过类名引用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:27:12