Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 列表和复制的可变列表之间的差异_Android_Kotlin - Fatal编程技术网

Android 列表和复制的可变列表之间的差异

Android 列表和复制的可变列表之间的差异,android,kotlin,Android,Kotlin,我将列表类型变量复制为可变列表类型的新变量 然后更新新项目的值 但原始变量也被更新了 这些都指向同一个地址吗 为什么? var foodList=listOf( 食品模型(“咖喱”,2000年) 食品模型(“大米”,1000) ) //将foodList复制到新变量MutableList类型 val templast=foodList作为可变列表 Log.e(“怪异”,圣殿骑士[position]。名称+“”+tempList[position]。价格) Log.e(“怪异”,食物列表[posi

我将列表类型变量复制为可变列表类型的新变量

然后更新新项目的值

但原始变量也被更新了

这些都指向同一个地址吗

为什么?

var foodList=listOf(
食品模型(“咖喱”,2000年)
食品模型(“大米”,1000)
)
//将foodList复制到新变量MutableList类型
val templast=foodList作为可变列表
Log.e(“怪异”,圣殿骑士[position]。名称+“”+tempList[position]。价格)
Log.e(“怪异”,食物列表[position]。名称+“”+foodList[position]。价格)
//E/怪异:大米1000
//E/怪异:大米1000
tempList[position]=FoodModel(nameEdit.text.toString(),priceEdit.text.toString().toInt())
Log.e(“怪异”,圣殿骑士[position]。名称+“”+tempList[position]。价格)
Log.e(“怪异”,食物列表[position]。名称+“”+foodList[position]。价格)
//E/怪异:大米3333
//E/怪异:大米3333

FoodModel是引用类型,因此您的
foodList
是一个引用列表。复制时,会得到一个新列表,其中包含对模型的旧引用,因此,在修改新列表中的引用值时,它会反映到以前的列表中

您可以通过创建列表的深度副本来解决此问题。例如:

数据类FoodModel(val str:String,val int:int)
mapTo(mutableListOf(),FoodModel::copy)
这些都指向同一个地址吗

是的,因为
foodList as MutableList
没有复制,它是类型转换,可能导致
ClassCastException
不支持操作异常。要复制列表,请使用
toMutableList()


由于
是类型转换,因此在这种情况下不需要深度复制
var foodList = listOf(
    FoodModel("curry", 2000)
    FoodModel("rice", 1000)
)


// copyed foodList to new variable MutableList<FoodModel> type
val tempList = foodList as MutableList<FoodModel>

Log.e("weird", tempList[position].name+" "+tempList[position].price)
Log.e("weird", foodList[position].name+" "+foodList[position].price)
//E/weird: rice 1000
//E/weird: rice 1000


tempList[position] = FoodModel(nameEdit.text.toString(), priceEdit.text.toString().toInt())


Log.e("weird", tempList[position].name+" "+tempList[position].price)
Log.e("weird", foodList[position].name+" "+foodList[position].price)
//E/weird: rice 3333
//E/weird: rice 3333
val tempList = foodList.toMutableList()