Kotlin内部类构造调用报错解析及修复方法咨询
我来帮你搞清楚这个错误的来龙去脉,以及怎么修复它~
首先,咱们先拆解错误提示的核心意思:内部类InnerClassX的构造方法只能通过它所在的外部类实例来调用。为什么会触发这个错误?
你代码里的InnerClassX被标记成了inner class,而Kotlin中inner类的核心特性是:它会持有其直接外部类的实例引用。在你的代码结构里,InnerClassX的直接外部类是InnerClassSuper,而不是OuterClass!所以当你尝试直接调用InnerClassX("Hello")时,编译器找不到对应的InnerClassSuper实例作为接收者,自然就抛出了这个错误。
而且从你的代码意图来看,你只是想返回InnerClassSuper的子类实例,完全不需要InnerClassX持有InnerClassSuper的引用,所以这个inner修饰符其实是多余的,也是问题的根源。
修复方案
最简单且符合你需求的做法,就是把InnerClassX的inner修饰符去掉:
class OuterClass { fun someFun(): InnerClassSuper { return InnerClassX("Hello") // 现在可以正常编译了 } sealed class InnerClassSuper { class InnerClassX(val x: String) : InnerClassSuper() // 移除inner关键字 } }
额外补充(如果真的需要inner类的场景)
假设你确实需要InnerClassX作为InnerClassSuper的inner类(虽然这个场景下没必要),那你必须先获取InnerClassSuper的实例,再通过该实例来构造InnerClassX。但因为InnerClassSuper是密封类,本身无法直接实例化,你得先定义它的一个具体子类实例,再基于此创建InnerClassX——不过这显然不符合你当前的代码意图,所以还是推荐上面的方案。
内容的提问来源于stack exchange,提问作者Pravin Sonawane
相关产品推荐
相关产品推荐

