将Any转换为Long

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

  

java.lang.ClassCastException:java.lang.Object []无法转换为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)
}
qiuyue00 回答:将Any转换为Long

您不能仅在此处使用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)

但如果它具有非数字的“输入”,则可能不适用于您的真实数据。


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

要么删除它,要么处理所有值:

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

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

由于boxingAny对应于Java Object,因此在传递给getMyLongValue时所有原语都被装箱。而且您无法将装箱的Intjava.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)
}

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

fun getMyValue(vararg any: Any): Long {
    return getMyLongValue(*any)
}
本文链接:https://www.f2er.com/3028442.html

大家都在问