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
相关产品推荐
相关产品推荐

