【问题标题】:Are Kotlin data types built off primitive or non-primitive Java data types?Kotlin 数据类型是基于原始或非原始 Java 数据类型构建的吗?
【发布时间】:2018-01-07 07:35:18
【问题描述】:

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

【问题讨论】:

  • 从下面的答案中得到的最大收获是,数字在 koltin 中被视为对象(并且必须显式转换),但编译器尽可能使用原语来最大化性能和效率,所以不用担心关于那个。
  • 这是 2017 年 - 在 99.9% 的情况下,数值操作是否有效并不重要。我曾研究过热建模等情况,但很少有这样的担心不是微优化和浪费时间的情况。
  • @corsiKa 我们很多人都需要知道这些信息,它仍然像 10 年前一样重要。为什么您认为他们正在改进处理器中的 SIMD 支持?此外,如果您不考虑这一点,任何类型的图像或音频操作都会非常低效
  • @jontro 您似乎没有阅读我的评论。我研究过一些重要的案例——Beowulf 集群上的十亿多多边形热建模场景。当然,这很重要。然而,绝大多数,压倒性的,极其庞大的大多数,实际上至少 99%(不夸张)不会在意。对于每个进行音频处理的工程师,有 100 名工程师为 Big Company Inc 抽出另一个内部网络应用程序,以替换不断从公司共享驱动器中删除的电子表格。
  • @corsiKa 我完全阅读了您的推荐,但这仍然是一个有效且很好的问题,这里的很多主题都是关于专业知识的

标签: java int kotlin


【解决方案1】:

我取了一个Int 类型,然后尝试通过说num as Double 将其转换为Double <...> 但是,这失败了,说Int 不能转换为Double。我假设这是因为它是基于 Integer 类而不是原始的 int 数据类型构建的。

不,有两点需要注意:

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

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

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

最有效的方法是使用像.toDouble() 这样的数字转换函数。其实这些函数都是intrinsified的,在你使用的时候没有函数调用开销。它们的编译方式与 javac 为 Java 数字转换或隐式转换生成的内容非常接近。您可以通过 Kotlin 编译器生成的 inspect the bytecode 来了解其底层内容以及特定转换是否会引入任何开销。

另请参阅:类似问题的答案,(link)

【讨论】:

    【解决方案2】:

    这是因为 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()
    

    【讨论】:

    • @BasilBourque 嗨,对不起,我不擅长英语。现在怎么样?
    • 我理解技术问题,但英文不清楚。我编辑了答案中的文字以澄清。而且你的英文还不错,其实还不错,很清楚,就是这一个小毛病。
    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多