如何检查Kotlin变量的类型

问题描述 投票:0回答:5

我正在编写一个

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")        
}
variables if-statement kotlin
5个回答
9
投票

您可以使用

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")
        }
    }
}

4
投票

推断类型意味着编译器已经检索到对象的数据类型。

所以,

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
类相同,可以保存任何类型的数据,你必须照顾对象类型


2
投票

您出现此错误是因为您的

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
}

2
投票

我认为你做的一切都是正确的。显示错误

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
}

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
}
© www.soinside.com 2019 - 2024. All rights reserved.