Kotlin中是否可对x: X类型重载x[i] += j索引赋值操作符?
Kotlin 下标复合赋值
x[i] += j 重载方案 结论
可以重载,除了你提到的中间包装类方案外,还有更简洁的原生支持实现方式。
方案1:原生自动展开(最简单,适合绝大多数场景)
Kotlin对下标复合赋值操作默认有解析规则:只要你的X类同时重载了get和set运算符,x[i] += j会被自动展开为x[i] = x[i] + j,无需额外定义其他方法。
示例代码:
class X { // 示例用内部存储,可根据需求替换为自定义存储结构 private val values = mutableListOf<Int>(1, 2, 3, 4) // 重载下标取值 operator fun get(index: Int): Int = values[index] // 重载下标赋值 operator fun set(index: Int, value: Int) { values[index] = value } } // 调用示例 fun main() { val x = X() x[0] += 5 // 等价于 x[0] = x[0] + 5 println(x[0]) // 输出 6 }
方案2:自定义包装类(适合需要特殊定制复合赋值逻辑的场景)
你提到的返回持有原对象引用的中间类方案是官方推荐的自定义实现方式,注意运算符方法名是plusAssign而非plugAssign,实现示例如下:
// 中间包装类,持有原对象和对应下标 class XAtIndex(private val parent: X, private val index: Int) { // 自定义 += 逻辑 operator fun plusAssign(j: Int) { // 这里可实现任意自定义修改原对象的逻辑 parent.values[index] = parent.values[index] * 2 + j } } class X { // 设为internal方便同包下的包装类访问,也可通过其他方式封装 internal val values = mutableListOf<Int>(1, 2, 3, 4) // 重载get返回包装类实例 operator fun get(index: Int) = XAtIndex(this, index) } // 调用示例 fun main() { val x = X() x[0] += 3 // 执行自定义逻辑:1*2 +3 =5 println(x.values[0]) // 输出5 }
注意事项
不要同时实现两种方案,否则编译器会检测到调用歧义,直接报错。
内容的提问来源于stack exchange,提问作者Infima
相关产品推荐
相关产品推荐

