如何在Kotlin中创建作为内部类的匿名类实例
问题分析与解决方案
你的实现不可行,核心问题有两点:
- 你代码中尝试引用的
outerIsSuper.Inner()不存在——OuterIsSuper类内部并没有定义名为Inner的嵌套/内部类。 - 即使是要继承现有内部类创建匿名对象,也需要遵循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
相关产品推荐
相关产品推荐

