我是Kotlin的新手,正在玩数据类型。我采用了Int
类型,然后尝试将其作为Double
转换为num as Double
,这是一个在java中有效的调用(非语法但你明白了)。但是,这失败了,说Int不能被强制转换为Double。我假设这是因为它是基于Integer类而不是原始int数据类型构建的。我是否正确,投资价值最有效的方法是什么?有一个.toDouble()
函数,但这似乎效率低下且难以处理。
答案 0 :(得分:41)
我采用
Int
类型,然后尝试将其Double
< ...>num as Double
转换为Double
。但是,这失败了,说Int不能转换为Integer
。我假设这是因为它是基于int
类而不是原始Int
数据类型构建的。
不,有两点需要注意:
Kotlin将其数字类型(Long
,Double
,intNum as Double
等)定位为不相互嵌套,否这些类型之间的子类型关系。这就是演员.toDouble()
在Kotlin没有成功的原因。这也是为什么这些类型之间没有隐式转换的原因。相反,the numeric conversion is done with the corresponding functions(例如Int?
)
Kotlin中的数字类型用法尽可能编译为JVM原语。一些用法需要盒装类型(例如,可空Int
需要装箱,而.toDouble()
作为类型参数的通用类型实现也是如此),但编译器决定它们是否对每种情况都是必需的。< / p>
&LT; ...&GT;投射价值最有效的方法是什么?有一个
.toDouble()
函数,但这似乎效率低下且难以处理。
最有效的方法是使用methodA()
之类的数字转换函数。实际上,这些函数是内在化的,并且在使用它们时没有函数调用开销。它们与javac为Java数字转换或隐式转换产生的密切编译。您可以{Komplin编译器生成inspect the bytecode来了解它的内幕以及特定转换是否会引入任何开销。
另请参阅:对类似问题的回答,(link)
答案 1 :(得分:11)
这是因为Kotlin在扩大数字方面不像Java那样工作。
Kotlin中numbers没有隐含的扩展转换。例如,你可以用Java编写一些东西:
int a = 1;
double b = a;
但是,你不能在Kotlin写一些东西。例如:
val a:Int = 1
// v--- can't be widening
val b:Double = a
这是因为Kotlin中的所有内容都是对象,没有原始类型,因此您应该明确地将Int
转换为Double
,例如:
val a:Int = 1
// v--- convert it explicitly by `toDouble()` method
val b:Double = a.toDouble()