当前位置: 首页 > 知识库问答 >
问题:

在进行值矫揉造作[重复]之后,智能转换为“布尔”是不可能的

许照
2023-03-14

第二次打印时出错n:

智能强制转换为“Boolean”是不可能的,因为“r.isSquare”是一个可变属性,此时可能已被更改

fun main(args: Array<String>) {
    val r: Rectangle = Rectangle(5,5)
    println(r.isSquare)
    r.isSquare = true
    println(r.isSquare) // error but works with println(r.isSquare?:false)

}

data class Rectangle(var height: Int, var width: Int){
    var isSquare: Boolean? = null
}

如果它是null,它会像第一个println一样打印null,为什么我必须这样做?

println(message: Any?)
println(message: Boolean)

编辑2

下面是我如何处理编译器以保持对isSquare是布尔值的信任?

fun main(args: Array<String>) {
    val r: Rectangle = Rectangle(5, 5)
    println(r.isSquare)
    r.isSquare = true as Boolean? // if no cast, he will try wrong println signature
    println(r.isSquare)
}

data class Rectangle(var height: Int, var width: Int){
    var isSquare: Boolean? = null
}

共有1个答案

申颖逸
2023-03-14

由于r.issquare是一个可变属性,编译器无法在null检查后将其智能强制转换为非null属性。

您可以使用let:

r.isSquare.let { println(it) }

let只读取r.issquare的值一次,它在lambda中提供与it相同的值。因此即使在null检查之后也不必使用!!来访问布尔值。

fun main(args: Array<String>) {
    var x : Any
    x = ""
    x.toUpperCase() // OK, smart cast to String
}

第一个println使用此println(消息:any?)

由于您将true分配给issquare下一步,因此当您尝试打印issquare类型时,编译器将尝试将issquare智能强制转换为boolean类型。但无法智能强制转换,因为属性是可变类型。

如果删除行r.issquare=true,则编译器不会尝试将其智能强制转换为boolean,而是使用带有any?println作为参数。

 类似资料: