我正在编写一个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")
}
答案 0 :(得分:0)
您有此错误,因为您的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
}
答案 1 :(得分:0)
您可以使用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")
}
}
}
答案 2 :(得分:0)
我认为您做对了所有事情。出现错误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
}
答案 3 :(得分:0)
推断的类型意味着编译器已检索到对象的数据类型。
因此,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
类相同,可以保存任何类型的数据,并且您必须注意对象类型