我正在学习Kotlin,但似乎找不到简单问题的直接答案。我想这是一个很新的问题,还没有人有机会提出显而易见的问题。所以它开始了。
当我想获得一个范围内最小的项目时,我会键入:
range.start
但我收到警告,"可以用未装箱的first
替换"。不确定开箱意味着什么——甚至无法猜测。但是当我使用这个命令时:
range.first
警告消失了。这里发生了什么?我应该担心吗?为什么Kotlin同时有开始和第一?
Boxing和unboxing指的是将基元值包装在类中,以便它可以与泛型类和函数一起使用或作为可为null的值使用。在Java中,这更透明,因为每种类型的变量的基元和装箱版本都有不同的名称(即int
和Integer
(,而在Kotlin中,这一点并不明显。如果你的变量是可为null的,比如Int?
,它总是被装箱的,但如果它不可为null,那么只有当它被传递给泛型函数或请求可为null版本时,它才会被装箱。因此,boxing作为一个动词,是指变量在传递给需要装箱版本的对象时被包装在类中。
有一个名为ClosedRange
的通用范围的接口。当您使用整数范围时,您使用的是一个名为IntRange
的类,它也实现了ClosedRange<Int>
。
当您使用像start
这样的通用接口的属性时,JVM必须装箱和取消装箱您的Int
值。这是因为泛型不能与非装箱基元一起使用。装箱和取消装箱原语会有少量的运行时开销。
实际的类IntRange
将范围的开始和结束的值存储为基元,因此,如果使用first
直接访问它们,则可以绕过在使用泛型接口属性时发生的装箱,以获得较小的性能增益。
在绝大多数情况下,性能差异无论如何都可以忽略不计,但默认的代码检查建议您使用更高性能的方式。