在Kotlin中,开始和开始之间有什么区别?

时间:2020-04-08 02:09:59

标签: kotlin range

我正在学习Kotlin,但似乎找不到简单问题的直接答案。我以为它太新了,还没有人问过明显的问题。这样就可以了。

当我想获得范围内最小的物品时,键入:

range.start

但是我得到警告,“可以用未装箱的first代替”。不确定 unboxed 的意思-甚至无法猜测。但是当我使用此命令时:

range.first

警告消失。这里发生了什么事?我什至应该担心吗?为什么Kotlin同时具有 start first

1 个答案:

答案 0 :(得分:9)

装箱和拆箱是指将原始值包装在类中,以便可以将其与泛型类和函​​数一起使用或用作可空值。在Java中,这更加透明,因为每种类型的变量的原始版本和盒装版本都有不同的名称(即intInteger),而在Kotlin中,这不是很明显。如果您的变量是可空值的,例如Int?,则始终将其装箱,但如果它不是不可空值的,则仅在将其传递给通用函数或请求可空版本的函数时才进行装箱。因此 boxing 作为动词是指变量在传递给需要盒装版本的东西时被包装在类中。

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

使用start之类的通用接口的属性时,JVM必须对Int值进行装箱和拆箱。这是因为泛型不能与非盒装基元一起使用。将原语装箱和拆箱的运行时开销很小。

实际的类IntRange将范围的开始和结束的值存储为基元,因此,如果您直接使用first访问它们,那么您将跳过通过泛型进行的装箱操作界面属性,以提高性能。

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