Kotlin嵌套data class添加内部Player类实例问题求助
问题核心原因
你原有代码存在3个核心语法错误,导致运行和编译报错:
- Kotlin中
val修饰的属性是只读属性,仅能在构造方法赋值,无法后续直接修改,你未初始化gm就直接给gm.gamename赋值本身不符合语法要求 - 创建嵌套内部Data Class实例需要调用构造方法传入参数,
val p = newGame.Player是引用类类型而非创建实例,IDE误判你要访问伴生对象成员才弹出需要companion object的提示 - Kotlin默认的
List是只读集合,没有add方法,无法直接添加元素
正确实现方案
步骤1:调整Data Class定义(可选,按需选择)
如果需要构造完NewGame实例后仍能动态添加玩家,优先将players属性改为MutableList,同时建议遵循Kotlin命名规范调整类名首字母大写:
data class NewGame( val gamename: String, val gamedate: String, // 改为MutableList并给默认空列表,构造时可以不传后续添加 val players: MutableList<Player> = mutableListOf() ) { data class Player( val player: String, val player_id: Int, val score: Int, val points: Int ) }
如果不需要构造后新增玩家,无需修改原有定义,直接在构造NewGame时传入完整Player列表即可。
步骤2:正确创建Player与NewGame实例
// 先构造Player实例 val player1 = NewGame.Player( player = Player1.text.toString(), player_id = 1, // 替换为实际玩家ID score = 0, // 替换为实际初始分数 points = 0 // 替换为实际初始积分 ) // 构造外层NewGame实例 val gm = NewGame( gamename = GamesList.text.toString(), gamedate = "2024-05-20" // 替换为实际游戏日期 ) // 动态添加玩家 gm.players.add(player1) // 不需要动态添加的写法 // val playerList = listOf(player1, player2) // val gm = NewGame(gamename = xxx, gamedate = xxx, players = playerList)
步骤3:结合Retrofit发起请求
你写的CreateGame接口的companion object定义是正确的,直接调用create方法拿到接口实例后传入构造好的NewGame对象即可发起请求:
// 创建接口实例 val createGameService = CreateGame.create() // 发起请求 val call = createGameService.addNewGame( operation = "你的操作参数", // 替换为实际接口要求的operation值 newGame = gm ) // 异步执行请求 call.enqueue(object : retrofit2.Callback<gameEvent> { override fun onResponse(call: retrofit2.Call<gameEvent>, response: retrofit2.Response<gameEvent>) { if (response.isSuccessful) { // 请求成功处理逻辑 } } override fun onFailure(call: retrofit2.Call<gameEvent>, t: Throwable) { // 请求失败处理逻辑 } })
内容的提问来源于stack exchange,提问作者Tim Foster
相关产品推荐
相关产品推荐

