我正在尝试将对象的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)
}
答案 0 :(得分:1)
您不能仅在此处使用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
}
答案 1 :(得分:1)
我正在传递Int值,但我想强制转换为Long。那为什么不允许呢?
由于boxing。 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
}
}
编辑:
此问题与转换为Long
无关。当你写
fun getMyLongValue(vararg any: Any) { ... }
fun getMyValue(vararg any: Any): Long {
return getMyLongValue(any)
}
您将any
中的整个getMyValue
作为单个参数(类型为Array<Any>
)传递。要分别传递10
和15
(或getMyValue
的其他参数),您需要使用the spread operator:
fun getMyValue(vararg any: Any): Long {
return getMyLongValue(*any)
}