我正在学习Kotlin,但似乎找不到简单问题的直接答案。我以为它太新了,还没有人问过明显的问题。这样就可以了。
当我想获得范围内最小的物品时,键入:
range.start
但是我得到警告,“可以用未装箱的first
代替”。不确定 unboxed 的意思-甚至无法猜测。但是当我使用此命令时:
range.first
警告消失。这里发生了什么事?我什至应该担心吗?为什么Kotlin同时具有 start 和 first ?
答案 0 :(得分:9)
装箱和拆箱是指将原始值包装在类中,以便可以将其与泛型类和函数一起使用或用作可空值。在Java中,这更加透明,因为每种类型的变量的原始版本和盒装版本都有不同的名称(即int
和Integer
),而在Kotlin中,这不是很明显。如果您的变量是可空值的,例如Int?
,则始终将其装箱,但如果它不是不可空值的,则仅在将其传递给通用函数或请求可空版本的函数时才进行装箱。因此 boxing 作为动词是指变量在传递给需要盒装版本的东西时被包装在类中。
有一个用于通用范围的接口,称为ClosedRange
。使用整数范围时,您使用的是名为IntRange
的类,该类也实现了ClosedRange<Int>
。
使用start
之类的通用接口的属性时,JVM必须对Int
值进行装箱和拆箱。这是因为泛型不能与非盒装基元一起使用。将原语装箱和拆箱的运行时开销很小。
实际的类IntRange
将范围的开始和结束的值存储为基元,因此,如果您直接使用first
访问它们,那么您将跳过通过泛型进行的装箱操作界面属性,以提高性能。
在大多数情况下,性能差异还是可以忽略不计的,但是默认的代码检查建议您使用性能更高的方式。