在 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?
因为 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)
}
您将 getMyValue
中的整个 any
作为单个参数(Array<Any>
类型)传递。要分别传递 10
和 15
(或 getMyValue
的其他参数),您需要使用 the spread operator:
fun getMyValue(vararg any: Any): Long {
return getMyLongValue(*any)
}
我正在尝试将对象的 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?
因为 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)
}
您将 getMyValue
中的整个 any
作为单个参数(Array<Any>
类型)传递。要分别传递 10
和 15
(或 getMyValue
的其他参数),您需要使用 the spread operator:
fun getMyValue(vararg any: Any): Long {
return getMyLongValue(*any)
}