如何解决Kotlin中调用子类方法时的'Unresolved Reference'错误
解决Kotlin中父类变量调用子类方法的"Unresolved Reference"错误
你的问题出在类型匹配与多态机制上:你将FoldablePhone实例赋值给了Phone类型的变量phone,但fold()和unfold()是子类FoldablePhone独有的方法,父类Phone中并未定义这些方法,因此编译器无法识别这两个调用。
解决方案1:直接声明变量为子类类型
如果不需要多态特性,直接将变量类型指定为FoldablePhone,这样就能直接调用子类的所有方法:
fun main() { var phone: FoldablePhone = FoldablePhone() phone.fold() phone.switchOn() phone.unfold() }
解决方案2:类型转换(保留父类类型时使用)
如果必须保留Phone类型的变量(比如多态场景),可以通过类型转换让编译器识别子类方法:
- 安全转换(推荐):使用
as?进行可空转换,避免类型不匹配时抛出异常
fun main() { var phone: Phone = FoldablePhone() // 仅当phone是FoldablePhone实例时才执行fold() (phone as? FoldablePhone)?.fold() phone.switchOn() (phone as? FoldablePhone)?.unfold() }
- 强制转换:当你确定变量一定是
FoldablePhone实例时,使用as强制转换
fun main() { var phone: Phone = FoldablePhone() (phone as FoldablePhone).fold() phone.switchOn() (phone as FoldablePhone).unfold() }
方案3:扩展父类方法(可选)
如果希望所有子类都支持折叠/展开行为,可以在父类中定义空实现或抽象方法,让子类重写:
open class Phone(var isScreenLightOn: Boolean = false){ // ... 原有方法 open fun fold() {} open fun unfold() {} } class FoldablePhone (var folded: Boolean = true): Phone() { override fun fold (){ if (!folded) { folded = true println(folded) isScreenLightOn = false } else { println(folded) } } override fun unfold (){ if (folded) { folded = false println(folded) } else { println(folded) } } // ... 其他方法 }
此时Phone类型的变量可以直接调用fold()和unfold()。
内容的提问来源于stack exchange,提问作者Vanny
相关产品推荐
相关产品推荐

