您不能仅在此处使用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。那为什么不允许呢?
由于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)
}
本文链接:https://www.f2er.com/3028442.html