这里有趣的交换我试图用b1更改a1的值,但它显示val无法重新分配编译时错误。如果我不能像这样改变那么它是如何做到的。
fun swap(a1: String, b1: String) {
val temp = a1
a1 = b1
b1 = temp
}
注意:这只是一个样本,可以知道为什么我无法重新分配局部变量,就像我们在java中所做的那样
答案 0 :(得分:24)
在Kotlin中val
声明final,只读,引用 - 这正是编译器错误告诉你的
Val无法重新分配
为val
分配值后,无法更改。如果您希望能够重新分配它,则必须将其声明为var
在Kotlin方法中,参数被隐式声明为final val
,因此您无法像在Java中那样重新分配它们。
但代码中的核心错误是您尝试交换方法参数。由于方法参数是按值传递的,而不是通过引用传递的,因此在Kotlin中不可能实现(在Java中不可能)。即使你在方法调用内部重新分配参数,传递给方法的原始变量也不会改变。
答案 1 :(得分:4)
这里有两个误解:
首先,在Kotlin中,所有参数都是final
,并且无法更改。就像在Java中一样,final
引用无法更改。因此,在尝试重新分配final
或val
引用时会出错。
其次,由于您拥有对String的引用的副本,因此您的交换函数不会影响调用者的原始引用。您的交换功能也不适用于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
答案 2 :(得分:0)
您无法更改函数参数值,而是为交换值创建新变量:
fun swap(a1: String, b1: String) {
val a1Swapped = b1
val b1Swapped = a1
}