Как проверить тип переменной Kotlin - PullRequest
0 голосов
/ 08 октября 2018

Я пишу 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")        
}

Ответы [ 4 ]

0 голосов
/ 08 октября 2018

Предполагаемый тип означает, что компилятор получил тип данных объекта.

Итак, val b = 4.33 - это Double (на основе компилятора kotlin).

Так что он принимает 'b' как Double везде.

Если вы хотите, чтобы переменная присваивалась различным типам данных, вам придется использовать Any class

, как

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 совпадает с Object классом из java и может содержать данные любого типа, и вы должны позаботиться о типе объекта

0 голосов
/ 08 октября 2018

Вы можете использовать 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")
        }
    }
}
0 голосов
/ 08 октября 2018

Я думаю, ты все делаешь правильно.Ошибка 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 голосов
/ 08 октября 2018

У вас есть эта ошибка, потому что ваша переменная 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...