Val无法在kotlin中为局部变量重新分配编译时错误

YLS*_*YLS 20 parameters kotlin

这里有趣的交换我试图用b1更改a1的值,但它显示val无法重新分配编译时错误.如果我不能像这样改变那么它是如何做到的.

fun swap(a1: String, b1: String) {
   val temp = a1
   a1 = b1
   b1 = temp
}
Run Code Online (Sandbox Code Playgroud)

注意:这只是一个示例,可以知道为什么我无法像在java中那样重新分配局部变量

Dal*_*kar 30

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

Val无法重新分配

分配值后val,无法更改.如果您希望能够重新分配它,则必须将其声明为var

在Kotlin方法中,参数被隐式声明为final val,因此您无法像在Java中那样重新分配它们.

但是代码中的核心错误是您尝试交换方法参数.由于方法参数是按值传递的,而不是通过引用传递的,因此在Kotlin中不可能实现(在Java中不可能).即使你在方法调用内部重新分配参数,传递给方法的原始变量也不会改变.

  • 你能更正这个答案吗?`val` 不是常量也不是不可变的,它是最终引用,使用可变/不可变会误导引用所指向的内容。他的错误不是直接与 `val` 相关,而是与 Kotlin 中始终为 `final` 的参数有关。 (2认同)

Jay*_*ard 6

这里有两个误解:

首先,在Kotlin中所有参数都是,final并且不能更改。就像在Java中一样,final引用不能更改。因此,当您尝试重新分配finalval引用时会收到错误消息。

其次,由于您具有对String的引用的副本,因此您的swap函数将不会对调用方的原始引用产生影响。您的交换功能在Java中也不起作用。

例如,调用您的代码不会执行任何操作:

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

// output:
// howdy
// goodbye
Run Code Online (Sandbox Code Playgroud)

绝对用文字或表达式调用它不会执行任何操作:

swap("happy","day")  // what references is it supposed to be swapping?
Run Code Online (Sandbox Code Playgroud)

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

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
}
Run Code Online (Sandbox Code Playgroud)

您可以致电:

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

// output:
// howdy goodbye
// goodbye howdy
Run Code Online (Sandbox Code Playgroud)