0

我很确定标题中问题的答案是否定的。但是我写了一个简单的代码,并在尝试编译时遇到了一个奇怪的错误。代码:

open class Animal (val stttt:String, val str:String = "hjm") {
    open var fff: String = ""
    open var image = ""
    open val food = ""
    open val habitat = ""
    var hunger: Int? = 10
}

 class Hippo ( var strrr:Int = 7) : Animal("just") {
     override var image = "hippo.jpg"
     override var food = "grass"
     override val habitat = "water"
 }

fun main(args: Array<String>) {
    val hippo: Hippo? = Hippo()
    hippo?.hunger = 5
    println(hippo?.hunger)  // println(hippo?.hunger as Int?) works!!
}

代码的最后一行:

println(hippo?.hunger) // println(hippo?.hunger as Int?) 有效!!

使编译器显示以下错误:

智能转换为 Int 是不可能的,因为 hippo?.hunger 是一个可变属性,此时本可以更改

但是,如果我删除以下行代码将被编译:

河马?饥饿= 5

有人可以解释一下,这行代码有什么问题导致代码无法成功编译?

在此处输入图像描述

4

1 回答 1

1

它运行得很好:Kotlin Playground example

该错误通常出现在您检查某些内容不为空的地方,因此您可以将其视为非空类型(Int在这种情况下),但这不适用于vars 因为它们可以更改,并且可能为空再次 - 所以你需要使用类似于hippo?.hunger?.let { bla bla }将值分配给无法更改的临时val(默认情况下)的东西。it

我不确定你为什么会在那里收到错误,也许它出于某种原因试图使用println(message: Int)调用而不是调用?println(message: Any?)您可以将光标放在println并执行ctrl+Q(或您的等效项)以找出它认为正在调用的函数。

但是,是的,如果智能铸造把你弄乱了,那可能是一个错误。选择Int?喜欢你正在做的事情是一种方法,或者做这let/run件事也可能奏效(hippo?.hunger.run(::println))。

顺便说一句,您的主要街区是否已关闭?缺少花括号

于 2020-10-14T18:10:00.637 回答