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

Kotlin中能否检测运算符优先级与括号对运算结果的影响?

结论

无法仅通过修改plus运算符函数的内部逻辑实现你要的差异化表现,原因如下:

  • Kotlin的括号分组、运算符优先级属于编译期语法解析阶段的逻辑,两种写法foo1+foo2+foo3和(foo1+foo2)+foo3的运算顺序完全一致,编译生成的字节码没有任何区别,运行期执行plus函数时,不会携带任何「代码书写时是否加了括号」的信息,自然也无法做判断。
  • 你当前的plus实现违背了Kotlin运算符重载的官方约定:plus运算符本应返回新的实例、不修改原有接收者对象,你直接修改接收者本身的实现本身就会带来很多反直觉的问题。
替代实现方案

如果要实现类似的效果,可以主动给运算中间结果加标记,示例代码如下:

data class Foo(var name: String, private var isBracketed: Boolean = false) {
    operator fun plus(foo: Foo): Foo {
        name = if (isBracketed) {
            "($name)${foo.name}"
        } else {
            name + foo.name
        }
        isBracketed = false
        return this
    }

    // 手动标记当前对象是括号内的运算结果
    fun bracket() = apply { isBracketed = true }
}

使用方式:

// 普通写法,输出123
val foo1 = Foo("1")
val foo2 = Foo("2")
val foo3 = Foo("3")
foo1 + foo2 + foo3
println(foo1.name) // 输出123

// 需要括号效果的写法,输出(12)3
val foo4 = Foo("1")
val foo5 = Foo("2")
val foo6 = Foo("3")
(foo4 + foo5).bracket() + foo6
println(foo4.name) // 输出(12)3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:06:03