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

