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

为何值相等的Kotlin TornadoFX属性对象用==比较结果为0?

为什么值相等的两个Property对象用==比较会返回不相等?

先看你给出的代码和输出:

println(costTable[1].numberGoodProperty)
println(SimpleIntegerProperty(objC.number))
val max11 = if (costTable[1].numberGoodProperty == SimpleIntegerProperty(objC.number)) 1 else 0
println("max11 $max11")

输出结果:

IntegerProperty [value: 2]
IntegerProperty [value: 2]
max11 0

核心问题:==比的是对象引用,不是属性值

在Kotlin(结合JavaFX的底层逻辑)里,==对于引用类型的默认行为是比较两个对象是不是同一个内存实例,而不是它们内部存储的数值。

你这里的costTable[1].numberGoodProperty是已经存在的一个IntegerProperty对象,而SimpleIntegerProperty(objC.number)是你新创建的另一个完全独立的对象——哪怕它们的value都是2,这俩在内存里是完全不同的两个实例,所以用==比较时自然会返回false,最终max11就变成了0。

正确的比较姿势

如果要判断两个Property的数值是否相等,有两种常用方法:

  1. 直接取它们的value来比较:
val max11 = if (costTable[1].numberGoodProperty.value == SimpleIntegerProperty(objC.number).value) 1 else 0
  1. 用Property自带的isEqualTo()方法(这是JavaFX为属性类专门提供的数值比较方法):
val max11 = if (costTable[1].numberGoodProperty.isEqualTo(SimpleIntegerProperty(objC.number)).value) 1 else 0

注意isEqualTo()返回的是一个BooleanBinding,所以要加.value拿到最终的布尔结果。

另外,如果你只是想和objC.number这个数值对比,其实完全没必要新建SimpleIntegerProperty,直接写更简洁:

val max11 = if (costTable[1].numberGoodProperty.value == objC.number) 1 else 0

额外提一句:Kotlin里==和===的区别

Kotlin的===是严格比较对象的内存地址,和Java的==完全一致;而Kotlin的==默认会调用对象的equals()方法,但JavaFX的Property类并没有重写equals(),所以它的equals()还是在比较引用地址——也就是说,不管你用==还是===,只要不是同一个Property实例,结果都是false。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:18:01