我正在学习kotlin的概念,在阅读主题数组时遇到了以下问题.

我创建了一个空的

val empty = arrayOf<Int>()
empty[0] = 2

因此,上面的代码将失败并导致ArrayIndexOutOfBoundsException,这是有意义的,因为数组的大小无法更改,并且由于数组初始化时没有大小,因此它被视为空array.

这就是我觉得有趣的地方

var emptyArray = arrayOf<Int>()
emptyArray += 1
emptyArray += 2

上面的代码没有失败,当我打印项目时,我会得到结果.我假设在try 向索引中添加元素时,与直接添加元素时,会发生一些事情,但我找不到任何文档来解释引擎盖下发生了什么.有人能解释一下吗

推荐答案

这是因为Kotlin的增广赋值运算符是overloaded.

对于赋值操作,例如a+=b,编译器执行以下步骤:

  • 如果右栏中的功能可用:
  • 否则,try 为a = a + b生成代码(这包括类型判断:a + b的类型必须是a的子类型).

"右列函数"指的是表中的右列,我在引号中没有包括它,它基本上是运算符函数plusAssignminusAssigntimesAssign等.当然,这些函数不适用于数组,所以第二个要点适用于这里.

要为a = a + b生成代码,需要为数组提供plus运算符函数,获取该数组的一个元素,并返回一个数组,以便将其转换为a = a.plus(b).Array<T>人中确实有such an operator function人.

operator fun <T> Array<T>.plus(element: T): Array<T>

总结一下:

emptyArray += 1

翻译成

emptyArray = emptyArray + 1

which 翻译成:

emptyArray = emptyArray.plus(1)

Kotlin相关问答推荐

最好的方法来创建一个 map 在kotlin从两个列表

在Kotlin中,我是否可以访问已知的WHEN子句值?

如何使用 Kotlin Maven 更改 Minecraft 插件中的 Shulker GUI 标题

始终抛出的函数 - 具有块主体的函数中需要的返回表达式

Kotlin 中的as Long和.toLong()有什么区别?

如何在 jOOQ 中两次加入同一张表?

如何在kotlin中使用协程每秒调用一个函数

Kotlin 中的数据类

DatabaseManager_Impl 不是抽象的,不会覆盖 RoomDatabase 中的抽象方法 clearAllTables()

Kotlin如何分派invoke操作符?

使用kotlinx协同程序测试中的类时出错

Kotlin:sealed class cannot "contain" data classes?

使用 Kotlin 创建自定义 Dagger 2 范围

Kotlin:相互递归函数的尾部递归

Lint 错误:可疑的相等判断:在 Object DiffUtilEquals 中未实现 equals()

Kotlin - 如果不为空,则使用修改后的 Obj props 覆盖 Obj props

将协程更新到 1.2.0 后构建失败:META-INF/atomicfu.kotlin_module

如何在 IntelliJ IDEA 中禁用粘贴时将 Java 转换为 Kotlin?

Kotlin中默认导入哪些包/函数?

具有多个 parameter的 Kotlin 枚举