在 kotlin 中将 Any 转换为 Long

Convert Any to Long in kotlin

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

java.lang.ClassCastException : java.lang.Object[] cannot be cast to java.lang.Long

在这里,我想将 any 转换为 Long,如下所示:

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

我正在将参数传递给它:

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

fun getMyValue(vararg any: Any): Long {
    return getMyLongValue(any)
}

您不能只在此处使用 as Long。因为它总是会失败,除非你传递 Long 参数。

您应该 toLong() 转换函数。但它不是Any的方法。所以你将不得不摆脱 Any 类型规范。

一种方法是使用泛型,仅限于某些 interface/class 已定义 toLong()。喜欢 Number.

fun <T: Number> getMyLongValue(vararg any: T) : Long {
    val myVal = any.first().toLong()
    return myVal
}

它绝对适用于

getMyLongValue(15, 10)

但可能不适用于您的真实数据,如果它包含非数字 "input"。


此外,如果您只使用第一个元素,为什么还要使用 vararg

要么放弃它,要么处理所有值:

fun <T: Number> getMyLongValue(vararg any: T) : List<Long> {
    val myVal = any.map { it.toLong() }
    return myVal
}

I am passing Int values but I want to cast to Long. Then why it's not allowing?

因为 boxingAny 对应 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
    }
}

编辑:

此问题与转换为 Long 无关。当你写

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

fun getMyValue(vararg any: Any): Long {
    return getMyLongValue(any)
}

您将 getMyValue 中的整个 any 作为单个参数(Array<Any> 类型)传递。要分别传递 1015(或 getMyValue 的其他参数),您需要使用 the spread operator:

fun getMyValue(vararg any: Any): Long {
    return getMyLongValue(*any)
}