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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:13:11