Kotlin数据类型是基于原始或非原始Java数据类型构建的吗?

时间:2017-07-31 16:18:03

标签: java int kotlin

我是Kotlin的新手,正在玩数据类型。我采用了Int类型,然后尝试将其作为Double转换为num as Double,这是一个在java中有效的调用(非语法但你明白了)。但是,这失败了,说Int不能被强制转换为Double。我假设这是因为它是基于Integer类而不是原始int数据类型构建的。我是否正确,投资价值最有效的方法是什么?有一个.toDouble()函数,但这似乎效率低下且难以处理。

2 个答案:

答案 0 :(得分:41)

  

我采用Int类型,然后尝试将其Double< ...> num as Double转换为Double。但是,这失败了,说Int不能转换为Integer。我假设这是因为它是基于int类而不是原始Int数据类型构建的。

不,有两点需要注意:

  • Kotlin将其数字类型(LongDoubleintNum 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()