Kotlin数据类型是由原始的还是非原始的Java数据类型构建的?

我是Kotlin的新手,正在玩弄数据类型。 我采取了一个Int类型,然后尝试把它作为一个Double通过说num as Double ,一个在java中有效的调用(非语法上,但你得到的重点)。 然而,这失败了,说诠释不能转换为双。 我假设这是因为它是建立在整数类而不是原始的int数据类型。 我是否正确,什么是最有效的投资价值的方式? 有一个.toDouble()函数,但是这似乎是低效和笨拙的。

我采取了一个Int类型,然后尝试通过num as Double <…>试图将其投掷num as Double 。但是,这失败了,说Int不能转换为Double 。 我假设这是因为它是建立在Integer类而不是原始的int数据类型。

不,有两点需要注意:

  • Kotlin将它的数字类型( IntLongDouble等)定位为不相互嵌套,这些类型之间 存在关系。 这就是为什么投入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()