在 kotlin 中将 Any 转换为 Long

Shy*_*dda 0 classcastexception kotlin

我正在尝试将Any对象的类型转换为Long,但它显示以下异常:

java.lang.ClassCastException:java.lang.Object[] 无法转换为 java.lang.Long

在这里我想将其转换anyLong如下所示:

    fun getMyLongValue(vararg any: Any) : Long {
    return when(val tmp = any.first()) {
        is Number -> tmp.toLong()
        else -> throw Exception("not a number")
    }
}
Run Code Online (Sandbox Code Playgroud)

我将参数传递给它,例如:

    fun main() { 
    val param1 = 10
    val param2 = 20
    println(getMyValue(param1.toLong(), param2.toLong())) 
}

fun getMyValue(vararg any: Any): Long {
    return getMyLongValue(any)
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*nov 6

我正在传递 Int 值,但我想转换为 Long。那为什么不允许呢?

因为拳击Any对应于 Java Object,因此所有原语在传递给 时都会被装箱getMyLongValue。并且您不能将盒装Int( java.lang.Integer) 转换为Long. 您需要单独处理基元,或者使用装箱的Int/ Long/etc 的事实。延伸Number,例如

fun getMyLongValue(vararg any: Any) : Long {
    return when(val tmp = any.first()) {
        is Number -> tmp.toLong()
        else -> throw Exception("not a number") // or do something else reasonable for your case
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

此问题与转换为Long. 当你写的时候

fun getMyLongValue(vararg any: Any) { ... }

fun getMyValue(vararg any: Any): Long {
    return getMyLongValue(any)
}
Run Code Online (Sandbox Code Playgroud)

您将整个anyfromgetMyValue作为单个参数(类型为Array<Any>)传递。要单独传递10and 15(或 的其他参数getMyValue),您需要使用扩展运算符

fun getMyValue(vararg any: Any): Long {
    return getMyLongValue(*any)
}
Run Code Online (Sandbox Code Playgroud)