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

Kotlin中设置SimpleMailMessage的to字段遇val无法重分配问题咨询

Kotlin中使用Spring SimpleMailMessage赋值to属性报错的解决方法

问题描述

我用Spring的SimpleMailMessage编写邮件代码时遇到编译器错误:

val message = SimpleMailMessage()
message.from = "myemail@gmail.com"
message.to = "email@togo.com" // 此处报错:val无法重分配
message.subject = "subject here"
message.text = "email body here"

目前我用message.setTo("email@togo.com")作为临时解决方法,想知道这是已知问题还是我有什么遗漏?

原因分析

这不是Spring或Kotlin的已知bug,而是Kotlin与Java互操作的特性导致的:

  • SimpleMailMessage是Java类,它的setTo方法接受String类型的varargs(本质是String[]数组),对应的getTo方法返回String[]。
  • 在Kotlin中,message.to会被解析为Array<String>?类型的属性,单个String无法直接赋值给数组类型;同时Kotlin会将该属性视为不可重新赋值的val(数组引用本身不可变,除非重新赋值整个数组),因此抛出“val无法重分配”的错误。

解决方法

有两种可行的处理方式:

1. 直接调用setTo方法(你当前的临时方案,也是推荐用法之一)

Java的varargs支持直接传入单个参数(会自动包装为数组),直接调用setTo完全合法:

message.setTo("email@togo.com")
// 多收件人可直接传多个参数
message.setTo("email1@togo.com", "email2@togo.com")

2. 将字符串包装为数组后赋值给to属性

如果偏好Kotlin的属性赋值语法,可把收件人包装成数组:

message.to = arrayOf("email@togo.com")
// 多收件人直接传入数组
message.to = arrayOf("email1@togo.com", "email2@togo.com")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:52:50