如何解决“未解析的引用”Kotlin 函数

How to solve "Unresolved Reference" Kotlin Function

提问人:Vanny 提问时间:4/27/2023 更新时间:4/27/2023 访问量:48

问:

我正在尝试构建以下程序:

open class Phone(var isScreenLightOn: Boolean = false){
    open fun switchOn() {
        isScreenLightOn = true
    }

    open fun switchOff() {
        isScreenLightOn = false
    }

    open fun checkPhoneScreenLight() {
        var phoneScreenLight = if (isScreenLightOn) "on" else "off"
        println("The phone screen's light is $phoneScreenLight.")
    }
}

   class FoldablePhone (var folded: Boolean = true): Phone() {
    
    fun fold (){
        if (folded == false){
            folded = true
            println(folded)
            isScreenLightOn = false
        }
        else {
            println(folded)
        }
    }
    
    fun unfold (){
        if (folded == true){
            folded = false
            println(folded)
        }
        else {
            println(folded)
        }
    }
    
    override fun switchOn(){
        if (folded == false){
            isScreenLightOn = true
            checkPhoneScreenLight()
        }
        else {
            println("Phone folded")
        }
    }
    
}

fun main()
{
    var phone: Phone = FoldablePhone()
    phone.fold()
    phone.switchOn()
    phone.unfold()
}

编译时,出现 main() 中 phone.fold() 和 phone.unfold() 的“未解析引用”错误。我在网上查了一下,没有发现任何帮助,因为人们说应该声明有问题的功能,而实际上我这样做了。请问我该如何解决这个问题?

函数 kotlin compiler-errors 函数声明

评论

0赞 Sweeper 4/27/2023
你为什么声明是类型?这使得和可用。如果它是 ,它就会起作用,即 .phonePhonefoldunfoldFoldablePhoneval phone = FoldablePhone()
0赞 Vanny 4/27/2023
我以为我必须这样写,因为 FoldablePhone 与 Phone 有 IS A 关系。
0赞 Sweeper 4/27/2023
你可以这样写,并允许存储其他类型的手机,但你不必这样写。phone
0赞 Vanny 4/27/2023
著名的。我遵循了您在第一条评论中发现的建议,编译器运行了该程序,没有问题。谢谢。

答:

1赞 Raman 4/27/2023 #1

您已将变量声明为 类型为 。但 和 函数仅在子类型上可用。因此,它们无法访问。phonePhonefoldunfoldFoldablePhone

而不是:

var phone: Phone = FoldablePhone()

您可以使用:

var phone: FoldablePhone = FoldablePhone()

或更短,因为 Kotlin 可以推断类型:

var phone = FoldablePhone()

或者,您可以在使用函数之前检查类型:fold/unfold

if (phone is FoldablePhone) phone.fold()

这使用“智能强制转换”,即 Kotlin 编译器知道变量内部是 a 并自动将其强制转换为该类型。ifphoneFoldablePhone

这种替代方法在实际程序中变得更加有用,其中函数可以对 的类型进行操作,并且它必须有条件地执行折叠/展开函数。Phone