提问人:Mohammad 提问时间:6/9/2023 更新时间:6/9/2023 访问量:77
SuperClass 可以是其子类的一种类型吗?
SuperClass can be a type of its SubClasses?
问:
在下面的代码中,n1 变量的确切类型是什么?
fun main() {
var n1: Number = 758.3
var n2: Double = n1
if (n1 is Double) {
println("Double")
} else if (n1 is Number) {
println("Number")
} else {
println("else")
}
}
如果是 Double,为什么第 3 行(n2 变量)有编译时错误?
如果是数字,为什么删除第 3 行(删除 n2 变量)时会打印?我们预计会打印出来Double
Number
我们知道 n1 是 Number,它不是 Double,除非它转换为 Double。我们没有这样做!
答:
n1
既是 a 又是 a。如果你写Number
Double
var n1: Number = 758.3
if (n1 is Double) {
println("Double")
}
if (n1 is Number) {
println("Number")
}
你会看到两者都被打印出来。此检查在运行时完成。这不能在编译时完成,这就是第 3 行给出错误的原因。请注意,可以写
if (n1 is Double) {
var n2: Double = n1
println("Double")
}
因为编译器知道,当它进入内部时,它必须是双精度的,并且可以进行这种同化if
n1 变量的确切类型是什么?
变量的类型是 ,因为您这样声明它。因此,编译器将禁止任何假设超过此值的内容。例如,它禁止将此变量的值分配给类似 的变量,因为它不允许你为包含的值假定更精确的类型(从编译器的角度来看,该值理论上可以是 的任何子类型)。n1
Number
Double
n2
n1
Number
如果是数字,为什么删除第 3 行(删除 n2 变量)时会打印 Double?我们预计该数字将被打印出来
您必须将变量的类型与其值的运行时类型区分开来。在这里,存储在变量中的值在运行时属于类型。由于这是 的子类型,因此该值也是 的类型(这就是为什么编译器允许将其存储在 type 的变量中的原因)。n1
Double
Number
Number
n1
Number
执行检查时,这些检查是检查值类型而不是变量类型的运行时检查。这就是为什么在运行时 both 和 都是 true 的原因,因为指向的值是这两种类型。is
n1 is Number
n1 is Double
n1
评论
n1
is
if