Kotlin 在科特林,什么';“开始”和“第一”有什么区别?

Kotlin 在科特林,什么';“开始”和“第一”有什么区别?,kotlin,range,Kotlin,Range,我正在学习Kotlin,但我似乎找不到简单问题的直接答案。我认为这是一个全新的概念,至今还没有人有机会提出明显的问题。就这样 当我想获取范围内最小的项目时,我键入: range.start 但我得到警告,“可以先用未装箱的替换”。不知道unboxed是什么意思,甚至猜不出。但是当我使用这个命令时: range.first 警告消失了。这里发生了什么事?我应该担心吗?为什么Kotlin既有起始值又有起始值?装箱和取消装箱指的是在类中包装一个基元值,以便它可以与泛型类和函数一起使用,或者作为一个

我正在学习Kotlin,但我似乎找不到简单问题的直接答案。我认为这是一个全新的概念,至今还没有人有机会提出明显的问题。就这样

当我想获取范围内最小的项目时,我键入:

range.start
但我得到警告,“可以先用未装箱的
替换”。不知道unboxed是什么意思,甚至猜不出。但是当我使用这个命令时:

range.first

警告消失了。这里发生了什么事?我应该担心吗?为什么Kotlin既有起始值又有起始值?

装箱和取消装箱指的是在类中包装一个基元值,以便它可以与泛型类和函数一起使用,或者作为一个可空值使用。在Java中,这是更透明的,因为每种类型变量的原语和装箱版本都有不同的名称(即
int
Integer
),而在Kotlin中,这不是很明显。如果变量可为null,如
Int?
,则始终将其装箱,但如果变量不可为null,则仅当它传递给泛型函数或请求可为null的版本时才会装箱。因此,作为动词的装箱指的是在将变量传递给需要装箱版本的对象时,将其包装在类中的变量

有一个通用范围的接口,名为
ClosedRange
。在处理整数范围时,您使用的是一个名为
IntRange
的类,该类还实现了
ClosedRange

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

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

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