首页 文章

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

提问于
浏览
31

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

2 回答

  • 39

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

    不,有两点需要注意:

    • Kotlin将其数字类型( IntLongDouble 等)定位为不相互嵌套,这些类型之间存在 no 子类型关系 . 这就是为什么演员 intNum as Double 在Kotlin没有成功 . 's also why there'这些类型之间没有隐式转换 . 相反,the numeric conversion is done with the corresponding functions(例如 .toDouble()

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

    <...>投射 Value 观的最有效方法是什么?有一个.toDouble()函数,但这看起来效率低,不实用 .

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

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

  • 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()
    

相关问题