Kotlin 数据类型是基于原始还是非原始 Java 数据类型构建的?
我是 Kotlin 的新手,正在研究数据类型。我拿了一个类型,然后试图通过说,一个在java中有效的调用(非语法上,但你明白了)。。然而,这失败了,说Int不能被施放到Double。我假设这是因为它是基于 Integer 类而不是原始 int 数据类型构建的。我说的对吗,转换值的最有效方法是什么?有一个功能,但这似乎效率低下且笨拙。Int
Double
num as Double
.toDouble()
我是 Kotlin 的新手,正在研究数据类型。我拿了一个类型,然后试图通过说,一个在java中有效的调用(非语法上,但你明白了)。。然而,这失败了,说Int不能被施放到Double。我假设这是因为它是基于 Integer 类而不是原始 int 数据类型构建的。我说的对吗,转换值的最有效方法是什么?有一个功能,但这似乎效率低下且笨拙。Int
Double
num as Double
.toDouble()
我拿了一个类型,然后试图通过说<来把它投射成一个......> 但是,这失败了,说Int不能被强制转换为。我假设这是因为它是基于类而不是原始数据类型构建的。
Int
Double
num as Double
Double
Integer
int
不,有两点需要注意:
Kotlin 将其数值类型 (, 等) 定位为不相互嵌套,这些类型之间没有子类型关系。这就是为什么演员阵容在 Kotlin 中没有成功的原因。这也是这些类型之间没有隐式转换的原因。相反,数值转换是使用相应的函数完成的(例如Int
Long
Double
intNum as Double
.toDouble()
)
在可能的情况下,Kotlin 中的数值类型用法被编译成 JVM 原语。某些用法需要盒装类型(例如,nullable 需要装箱,而具有 as 类型参数的泛型类型实现也是如此),但编译器决定它们对于每种情况是否必要。Int?
Int
<...> 什么是转换值的最有效方法?有一个功能,但这似乎效率低下且笨拙。
.toDouble()
最有效的方法是使用数字转换函数,如 。实际上,这些函数是内括的,并且在使用它们时没有函数调用开销。它们的编译与javac为Java数字转换或隐式转换生成的内容非常接近。您可以检查 Kotlin 编译器生成的字节码,以了解它在引擎盖下是什么,以及特定的转换是否引入了任何开销。.toDouble()
另请参阅:类似问题的答案(链接)
这是因为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,例如:Int
Double
val a:Int = 1
// v--- convert it explicitly by `toDouble()` method
val b:Double = a.toDouble()