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

aja*_*992 36 java int kotlin

我是Kotlin的新手,正在玩数据类型.我拿了一个Int类型,然后试着把它作为一个Doublenum as Double,一个在java中有效的调用(非语法但你明白了).但是,这失败了,说Int不能被强制转换为Double.我假设这是因为它是基于Integer类而不是原始int数据类型构建的.我是否正确,投资价值最有效的方法是什么?有一个.toDouble()功能,但这似乎是低效和笨拙的.

hot*_*key 43

我拿了一个Int类型,然后试着把它作为一个Doublenum as Double<...>然而,这失败了,说Int不能被施展Double.我假设这是因为它是基于Integer类而不是原始int数据类型构建的.

不,有两点需要注意:

  • 科特林定位其数值类型(Int,Long,Double等等)为不相互嵌套,有没有这些类型之间的子类型关系.这就是演员intNum as Double在Kotlin没有成功的原因.这也是为什么这些类型之间没有隐式转换的原因.相反,数字转换是使用相应的函数完成的(例如.toDouble())

  • Kotlin中的数字类型用法尽可能编译为JVM原语.一些用法需要盒装类型(例如,可空的Int?需要装箱,带有Int类型参数的泛型类型实现也是如此),但编译器决定它们是否对每种情况都是必需的.

<...>投射价值的最有效方法是什么?有一个.toDouble()功能,但这似乎是低效和笨拙的.

最有效的方法是使用数字转换函数.toDouble().实际上,这些函数是内在的,并且在使用它们时没有函数调用开销.它们与javac为Java数字转换或隐式转换产生的密切编译.您可以检查 Kotlin编译器生成的字节码,以找出它的内幕,以及特定转换是否会引入任何开销.

另见:对类似问题的回答,(链接)


hol*_*ava 11

这是因为Kotlin在扩大数字方面不像Java那样工作.

Kotlin中的数字没有隐含的扩大转换.例如,您可以使用Java编写一些内容,如下所示:

int a = 1;
double b = a;
Run Code Online (Sandbox Code Playgroud)

但是,你不能在Kotlin写东西.例如:

val a:Int = 1  
//             v--- can't be widening
val b:Double = a
Run Code Online (Sandbox Code Playgroud)

这是因为Kotlin中的所有内容都是对象,没有原始类型,因此您应该将其转换IntDouble显式,例如:

val a:Int = 1  
//               v--- convert it explicitly by `toDouble()` method
val b:Double = a.toDouble()
Run Code Online (Sandbox Code Playgroud)

  • 我理解技术问题,但英文不清楚.我在答案中编辑了文字以澄清.而且你的英语不错,实际上非常好和清楚,只是这一个小故障. (5认同)
  • @BasilBourque干得好,非常感谢。 (2认同)