我正在编写一个
Kotlin
程序,其中变量的type
是inferred
,但后来我想知道这个变量存储什么类型的值。我尝试了以下操作,但它显示以下错误。
Incompatible types: Float and Double
val b = 4.33 // inferred type of what
if (b is Float) {
println("Inferred type is Float")
} else if (b is Double){
println("Inferred type is Double")
}
您可以使用
b::class.simpleName
它将返回对象类型为 String
。
您不必初始化变量的类型,稍后您想检查变量的类型。
fun main(args : Array<String>){
val b = 4.33 // inferred type of what
when (b::class.simpleName) {
"Double" -> print("Inferred type is Double")
"Float" -> print("Inferred type is Float")
else -> { // Note the block
print("b is neither Float nor Double")
}
}
}
推断类型意味着编译器已经检索到对象的数据类型。
所以,
val b = 4.33
是Double(基于kotlin编译器)。
所以它假设'b'到处都是Double。
如果您想要将变量分配给不同的数据类型,则必须使用
Any
类
喜欢
fun main(vararg abc : String) {
var b : Any = 4.33 // inferred type of what
println(b)
if(b is Float) {
println("Float")
}
else if(b is Double) {
println("Double")
}
b = "hello"
println(b)
if(b is String) {
println("String")
}
}
输出于
4.33
Double
hello
String
这里
Any
与java中的Object
类相同,可以保存任何类型的数据,你必须照顾对象类型
您出现此错误是因为您的
b
变量已经是 Double
,所以无论如何它都不可能是 Float
。如果您想测试您的 if
语句,您可以更改变量初始化,如下所示:
val b: Number = 4.33 // Number type can store Double, Float and some others
顺便说一句,您可以将
if
替换为 when
语句
when (b) {
is Float -> println("Inferred type is Float")
is Double -> println("Inferred type is Double")
else -> //some default action
}
我认为你做的一切都是正确的。显示错误
Incompatible types: Float and Double
是因为您正在分配一个 const 值(并且分配给 val,因此它不会更改),可以在编译期间检查该错误。这意味着编译器已经知道变量的类型。但是,如果在执行过程中获取该值,就像这样,那么此检查将执行您想要的操作。
fun main() {
val b = getNumber() // inferred type of what
if (b is Float) {
println("Inferred type is Float")
} else if (b is Double){
println("Inferred type is Double")
}
}
fun getNumber():Number {
return 12.0
}
有更简洁的方法,使值仍然遵循最新 kotlin 版本中相应的值检查。
when(b) {
is Double -> println("Inferred type is Double") // you can use direct b as double in this checking section
is Float -> println("Inferred type is Float") // you can use direct b as float in this checking section
}
下面是在检查部分使用直接 b 而不将它们转换为预期类型的示例。
when(b) {
is Double -> test = 3.0 + b
is Float -> test = 3.0F + b
}