我是Kotlin的新手,正在玩数据类型.我拿了一个Int类型,然后试着把它作为一个Double说num as Double,一个在java中有效的调用(非语法但你明白了).但是,这失败了,说Int不能被强制转换为Double.我假设这是因为它是基于Integer类而不是原始int数据类型构建的.我是否正确,投资价值最有效的方法是什么?有一个.toDouble()功能,但这似乎是低效和笨拙的.
hot*_*key 43
我拿了一个
Int类型,然后试着把它作为一个Double说num 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中的所有内容都是对象,没有原始类型,因此您应该将其转换Int为Double显式,例如:
val a:Int = 1
// v--- convert it explicitly by `toDouble()` method
val b:Double = a.toDouble()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3736 次 |
| 最近记录: |