设置一个var类成员一个新值可以改变类型吗?

问题描述

我很确定标题中的问题的答案是“否”。 但是我写了一个简单的代码,尝试编译时出现了一个奇怪的错误代码

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是不可能的,因为河马?。饥饿是一个可变的属性,这一次可能已经改变了

但是,如果我删除以下行,则会编译代码

河马?.hunger = 5

有人可以解释一下,这行代码阻止了代码的成功编译吗?

enter image description here

解决方法

它运行得很好,如下所示:Kotlin Playground example

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

我不确定您为什么会收到错误消息,也许由于某种原因它正在尝试使用it调用而不是println(message: Int)调用?您可以将光标放在println(message: Any?)上,然后执行println(或您的等效方法)以找出它认为正在调用的函数。

但是,是的,如果聪明的演员把你弄乱了,那可能是一个错误。像执行操作一样投射到ctrl+Q是一种操作,或者也可以执行Int?let/run)。

您的主要街区是否已关闭?花括号不见了

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...