如何解决设置一个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
有人可以解释一下,这行代码阻止了代码的成功编译吗?
解决方法
它运行得很好,如下所示: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
)。
您的主要街区是否已关闭?花括号不见了
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。