当前位置: 首页 > 知识库问答 >
问题:

无法为Kotlin中的fun中的局部变量重新分配Val编译时错误

梁丘安晏
2023-03-14

在这里,在有趣的交换中,我试图用b1更改a1的值,但它显示“val不能被重新分配编译时错误”。如果我不能这样改变,那怎么可能呢?

fun swap(a1: String, b1: String) {
   val temp = a1
   a1 = b1
   b1 = temp
}

注意:这只是一个示例,了解为什么我不能像在Java中那样重新分配局部变量

共有3个答案

慕逸仙
2023-03-14

不能更改函数参数值,而是为交换的值创建新变量:

fun swap(a1: String, b1: String) {
    val a1Swapped = b1
    val b1Swapped = a1
}
薛楷
2023-03-14

这里有两个误解:

首先,在Kotlin中,所有参数都是最终参数,不能更改。就像在Java中一样,不能更改最终引用。因此,在尝试重新分配最终引用或val引用时,会出现错误。

其次,因为您有一个字符串引用的副本,所以swap函数不会影响调用者的原始引用。您的交换函数在Java中也不起作用。

例如,调用代码不起任何作用:

val s1 = "howdy"
val s2 = "goodbye"
swap(s1,s2)   // Java or Kotlin, doesn't matter
println(s1)
println(s2)

// output:
// howdy
// goodbye

并且肯定用文字或表达式调用它不会做任何事情:

swap("happy","day")  // what references is it supposed to be swapping?

您只能交换与调用者具有相同引用的对象内部的内容。要制作交换例程,您可以执行以下操作:

data class MutablePair(var one: String, var two: String)

fun swap(pair: MutablePair) {  // not thread safe       
   val temp = pair.one
   pair.one = pair.two
   pair.two = temp
}

你可以称之为:

val stringies = MutablePair("howdy", "goodbye")
println("${stringies.one} ${stringies.two}")
swap(MutablePair()
println("${stringies.one} ${stringies.two}")

// output:
// howdy goodbye
// goodbye howdy
澹台蕴藉
2023-03-14

在Kotlin中,val声明final、read only和reference,这正是编译器错误告诉您的

无法重新分配Val

将值赋给val后,将无法更改。如果您想重新分配它,必须将其声明为var

在静态编程语言中,方法参数被隐式声明为最终val,因此您不能像在Java中那样重新分配它们。

但代码中的核心错误是,您试图交换方法参数。由于方法参数是通过值传递的,而不是通过引用传递的,所以您想要在Kotlin中实现什么是不可能的(就像在Java中一样)。即使在方法调用中重新分配参数,传递给该方法的原始变量也不会更改。

 类似资料:
  • 问题内容: 我有一个座位数组,该数组有两个字符串(已选择和为空)。单击鼠标后,我想遍历数组并找到选定的座位。当我按下按钮时,它说: 无法分配最终的局部变量seatno,因为它是用封闭类型定义的。 问题答案: 关键是封闭类型中的方法局部变量实际上已 复制 到匿名类的实例中(这是由于激活框架的问题,但我将不做进一步的详细介绍,因为这与问题无关)。这就是为什么它们需要是final的原因,因为嵌套类型实例

  • 我有这两个函数,我试图修改元素。其中一个编译,另一个说“val不能重新分配”。以下函数有什么区别?为什么一个编译,另一个不编译? 编译的那个 那个说 无法重新分配Val

  • 我在IntelliJ中使用静态编程语言。 我有一段简短的代码 为什么在这个世界上它告诉我: 关于提到的变量,“Val不能重新分配”任何val实例都已完全更改为var。 为了确保这一点,我已经在其他类中更改了同名的变量,甚至还将类中的每个变量都更改为var,我仍然会遇到这个错误。 这与可拉伸的性质有关吗? 我错过了什么或做错了什么来得到这个错误,我如何修复它? 非常感谢。

  • 我为数据类创建了一个var扩展属性,如下所示: 但是,当我尝试将“Val”重新分配给此行中的新值时,编译器会抱怨“Val无法重新分配”: 我真的不明白为什么会这样??我有一个“var”位图属性而不是“val”,那么问题是什么?更重要的是,什么是解决方案或替代方案?

  • 问题内容: 浏览Java API源代码时,我经常看到方法参数已重新分配给局部变量。为什么要这样做? 这在java.util.HashMap中 问题答案: 这是线程安全性/更好性能的规则。在易失。如果将变量分配给局部变量,它将变为局部堆栈变量,该变量自动是线程安全的。而且,修改局部堆栈变量不会强制“先发生”,因此在使用它时不会产生同步损失(与之不同的是,每次读/写操作都会导致易失性,这会花费您获取/