Val不能在kotlin中重新分配编译时间错误的局部变量

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

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

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

在Kotlin val声明了final,只读,引用 – 这正是编译器错误告诉你的

瓦尔不能被重新分配

一旦给val赋值,就不能改变。 如果你想能够重新分配它,你必须声明为var

在Kotlin方法中,参数被隐含地声明为最终的val ,所以你不能像在Java中那样重新分配它们。

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

这里有两个误解:

首先,在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 

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

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