You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin字符串插值异常:调用对象属性却输出整个对象

Kotlin字符串插值中属性访问失效的原因及解决办法

我定义了如下带@Serializable注解的Shift数据类:

@Serializable
data class Shift(
    @SerialName("id") val id: String,
    @SerialName("username") val username: String,
    @SerialName("start") var start: LocalDateTime,
    @SerialName("end") var end: LocalDateTime?,
    @SerialName("canceled") var canceled: Boolean,
    @SerialName("user") val user: User,
)

尝试通过字符串插值生成路径"/schedule/shift/${shift.id}",预期输出为:

"/schedule/shift/288aa888-2380-4290-affe-510355265a6d"

但实际输出却把整个Shift对象代入后拼接.id,得到:

"/schedule/shift/{Shift(id=288aa888-2380-4290-affe-510355265a6d, username=guus, start=2025-01-24T19:00, end=null, canceled=false, user=User(username=guus, name=Guus, isAdmin=true)).id}"

原因分析

这是因为你实际写的代码里漏给属性访问表达式加大括号,写成了"/schedule/shift/$shift.id"而非"/schedule/shift/${shift.id}"。

Kotlin的字符串插值规则是:$后面如果跟的是单个标识符(比如$shift),会直接解析为该变量的toString结果;而如果是对象.属性这种复合表达式,必须用{}把整个表达式包裹起来,否则编译器会把$shift当成插值内容,后面的.id会被当作普通字符串直接拼接在后面,就出现了对象toString后加.id的结果。

解决办法

确保用大括号完整包裹属性访问的插值表达式:

val path = "/schedule/shift/${shift.id}"

内容的提问来源于stack exchange,提问作者ZoutigeWolf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:17:32