Val cannot be reassigned a compile time error for a local variable in fun in Kotlin
In Kotlin val
declares final, read only, reference - and that is exactly what compiler error is telling you with
Val cannot be reassigned
Once you assign value to val
, it cannot be changed. If you want to be able to reassign it you have to declare it as var
In Kotlin method parameters are implicitly declared as final val
, so you cannot reassign them just like you could in Java.
But the core error in your code is that you are trying to swap method parameters. Since method parameters are passed by value and not by reference what you want to achieve is impossible in Kotlin (just as well as it is impossible in Java). Even if you would reassign parameters inside method call original variables passed to the method would not change.
There are two misunderstandings here:
First, in Kotlin all parameters are final
and this cannot be changed. Just as in Java a final
reference cannot be changed. So you get an error when trying to reassign a final
or val
reference.
Second, since you have a copy of a reference to a String, your swap function would have no affect on the caller's original references. Your swap function wouldn't work in Java either.
For example, calling your code does nothing:
val s1 = "howdy"
val s2 = "goodbye"
swap(s1,s2) // Java or Kotlin, doesn't matter
println(s1)
println(s2)
// output:
// howdy
// goodbye
And definitely calling it with literals or expressions does nothing:
swap("happy","day") // what references is it supposed to be swapping?
You can only swap the contents inside of an object for which you hold the same reference as the caller. To make a swap routine, you would do something like:
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
}
Which you could call:
val stringies = MutablePair("howdy", "goodbye")
println("${stringies.one} ${stringies.two}")
swap(MutablePair()
println("${stringies.one} ${stringies.two}")
// output:
// howdy goodbye
// goodbye howdy