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

2022-09-01 03:49:48

我是 Kotlin 的新手,正在研究数据类型。我拿了一个类型,然后试图通过说,一个在java中有效的调用(非语法上,但你明白了)。。然而,这失败了,说Int不能被施放到Double。我假设这是因为它是基于 Integer 类而不是原始 int 数据类型构建的。我说的对吗,转换值的最有效方法是什么?有一个功能,但这似乎效率低下且笨拙。IntDoublenum as Double.toDouble()


答案 1

我拿了一个类型,然后试图通过说<来把它投射成一个......> 但是,这失败了,说Int不能被强制转换为。我假设这是因为它是基于类而不是原始数据类型构建的。IntDoublenum as DoubleDoubleIntegerint

不,有两点需要注意:

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

  • 在可能的情况下,Kotlin 中的数值类型用法被编译成 JVM 原语。某些用法需要盒装类型(例如,nullable 需要装箱,而具有 as 类型参数的泛型类型实现也是如此),但编译器决定它们对于每种情况是否必要。Int?Int

<...> 什么是转换值的最有效方法?有一个功能,但这似乎效率低下且笨拙。.toDouble()

最有效的方法是使用数字转换函数,如 。实际上,这些函数是内括的,并且在使用它们时没有函数调用开销。它们的编译与javac为Java数字转换或隐式转换生成的内容非常接近。您可以检查 Kotlin 编译器生成的字节码,以了解它在引擎盖下是什么,以及特定的转换是否引入了任何开销。.toDouble()

另请参阅:类似问题的答案(链接)


答案 2

这是因为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 中的所有内容都是对象,没有基元类型,因此您应该显式地将 a 转换为 a,例如:IntDouble

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

推荐