在 Kotlin 中,开始和第一个有什么区别?



我正在学习Kotlin,但似乎找不到简单问题的直接答案。我想这是一个很新的问题,还没有人有机会提出显而易见的问题。所以它开始了。

当我想获得一个范围内最小的项目时,我会键入:

range.start

但我收到警告,"可以用未装箱的first替换"。不确定开箱意味着什么——甚至无法猜测。但是当我使用这个命令时:

range.first

警告消失了。这里发生了什么?我应该担心吗?为什么Kotlin同时有开始第一

Boxing和unboxing指的是将基元值包装在类中,以便它可以与泛型类和函数一起使用或作为可为null的值使用。在Java中,这更透明,因为每种类型的变量的基元和装箱版本都有不同的名称(即intInteger(,而在Kotlin中,这一点并不明显。如果你的变量是可为null的,比如Int?,它总是被装箱的,但如果它不可为null,那么只有当它被传递给泛型函数或请求可为null版本时,它才会被装箱。因此,boxing作为一个动词,是指变量在传递给需要装箱版本的对象时被包装在类中。

有一个名为ClosedRange的通用范围的接口。当您使用整数范围时,您使用的是一个名为IntRange的类,它也实现了ClosedRange<Int>

当您使用像start这样的通用接口的属性时,JVM必须装箱和取消装箱您的Int值。这是因为泛型不能与非装箱基元一起使用。装箱和取消装箱原语会有少量的运行时开销。

实际的类IntRange将范围的开始和结束的值存储为基元,因此,如果使用first直接访问它们,则可以绕过在使用泛型接口属性时发生的装箱,以获得较小的性能增益。

在绝大多数情况下,性能差异无论如何都可以忽略不计,但默认的代码检查建议您使用更高性能的方式。

相关内容

  • 没有找到相关文章

最新更新