我正在学习 Kotlin,但我似乎无法找到简单问题的直接答案。我认为它太新了,还没有人有机会提出明显的问题。所以就到这里了。
当我想获得一个范围内最小的项目时,我输入:
range.start
Run Code Online (Sandbox Code Playgroud)
但我收到警告,“可以用未装箱代替first”。不确定未装箱是什么意思——甚至无法猜测。但是当我使用这个命令时:
range.first
Run Code Online (Sandbox Code Playgroud)
警告消失。这里发生了什么事?我应该担心吗?为什么 Kotlin 既有start又有first?
装箱和拆箱是指将原始值包装在一个类中,以便它可以与泛型类和函数一起使用或用作可空值。在 Java 中,这更加透明,因为每种类型变量的原始版本和装箱版本都有不同的名称(即int和Integer),而在 Kotlin 中这不是很明显。如果您的变量可以为空,例如Int?,它总是被装箱,但如果它是不可为空的,那么只有当它被传递给一个通用的函数或请求一个可为空版本的函数时,它才会被装箱。因此,作为动词的装箱是指变量在传递给需要装箱版本的东西时被包装在类中。
有一个通用范围的接口,称为ClosedRange. 当您处理整数范围时,您正在使用一个名为的类IntRange,该类也实现了ClosedRange<Int>.
当您使用像 的通用接口的属性时start,JVM 必须装箱和拆箱您的Int值。这是因为泛型不能与非装箱原语一起使用。装箱和拆箱原语有少量运行时开销。
实际的类IntRange将范围的开始和结束的值存储为基元,因此如果您直接使用 访问它们first,则可以绕过通过通用接口属性时发生的装箱,以获得小的性能增益。
在绝大多数情况下,性能差异无论如何都可以忽略不计,但默认代码检查建议您使用性能更高的方式。
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |