Kotlin数据类型是由原始的还是非原始的Java数据类型构建的?
我是Kotlin的新手,正在玩弄数据类型。 我采取了一个Int
类型,然后尝试把它作为一个Double
通过说num as Double
,一个在java中有效的调用(非语法上,但你得到的重点)。 然而,这失败了,说诠释不能转换为双。 我假设这是因为它是建立在整数类而不是原始的int数据类型。 我是否正确,什么是最有效的投资价值的方式? 有一个.toDouble()
函数,但是这似乎是低效和笨拙的。
我采取了一个
Int
类型,然后尝试通过num as Double
<…>试图将其投掷num as Double
。但是,这失败了,说Int不能转换为Double
。 我假设这是因为它是建立在Integer
类而不是原始的int
数据类型。
不,有两点需要注意:
-
Kotlin将它的数字类型(
Int
,Long
,Double
等)定位为不相互嵌套,这些类型之间不 存在关系。 这就是为什么投入intNum as Double
在Kotlin中不成功的原因。 这也是为什么这些类型之间没有隐式转换的原因。 相反, 数字转换是用相应的函数完成的 (例如.toDouble()
) -
在可能的情况下,Kotlin中的数字类型用法被编译成JVM原语。 一些用法需要盒装类型(例如,可以为空的
Int?
需要装箱,而以Int
为类型参数的通用类型实现也是如此),但是编译器决定它们是否对每种情况都是必需的。
什么是最有效的铸造价值的方法? 有一个
.toDouble()
函数,但是这似乎是低效和笨拙的。
最有效的方法是使用数字转换函数,如.toDouble()
。 实际上,这些函数是内在的 ,当你使用它们时没有函数调用的开销。 它们被紧密编译为javac为Java数字转换或隐式转换而产生的内容。 您可以检查 Kotlin编译器生成的字节码 ,以查明底层的内容以及特定的转换是否会引入任何开销。
另见:类似问题的答案, (链接)
这是因为Kotlin在扩展数字时不像Java一样工作。
Kotlin的数字没有隐含的扩大转换。 例如,你可以用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()