在这里,在有趣的交换中,我试图用b1更改a1的值,但它显示“val不能被重新分配编译时错误”。如果我不能这样改变,那怎么可能呢?
fun swap(a1: String, b1: String) {
val temp = a1
a1 = b1
b1 = temp
}
注意:这只是一个示例,了解为什么我不能像在Java中那样重新分配局部变量。
不能更改函数参数值,而是为交换的值创建新变量:
fun swap(a1: String, b1: String) {
val a1Swapped = b1
val b1Swapped = a1
}
这里有两个误解:
首先,在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
在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中 问题答案: 这是线程安全性/更好性能的规则。在易失。如果将变量分配给局部变量,它将变为局部堆栈变量,该变量自动是线程安全的。而且,修改局部堆栈变量不会强制“先发生”,因此在使用它时不会产生同步损失(与之不同的是,每次读/写操作都会导致易失性,这会花费您获取/