gpt4 book ai didi

Kotlin 集合 : Can you optionally key data classes by identity?

转载 作者:行者123 更新时间:2023-12-02 13:29:52 25 4
gpt4 key购买 nike

Kotlin 有数据类非常有用的特性,它具有值语义,即编译器会自动生成 equalshashCode基于字段的值。例如,您可以使用如下声明来表示抽象语法树

data class Plus(val a: Term, val b: Term) : Term()

但是,当需要将抽象语法树转换为 SSA 形式时,身份突然变得很重要。 a+b 的出现不得与该事件相混淆。

理想情况下需要的是可以在一种上下文中使用值语义和在另一种上下文中使用引用语义来处理的数据类。

这部分可以通过使用 == 来完成。与 === 相比值相等与身份比较的运算符。图片的另一半是集合、集合和映射,它们现在有时需要通过身份而不是内容来散列它们的键。

有没有办法覆盖集合和映射中键的默认处理,也就是说这次使用身份而不是内容?

最佳答案

我看到它的方式不是值(value)语义与引用语义,而是关于身份。

一个数据类代表一个值。一个值是不可变的并且没有标识,这意味着当且仅当它们具有相同的内容时,两个值是相同的。这就是编译器可以自动生成equals和hashcode的原因。

如果要对具有标识的实体建模,即随着时间的推移与一系列不同值相关联的稳定逻辑实体,则应使用常规类并定义其标识是什么。它可以是 uuid 或内存地址。

也可以使用数据类对实体建模。你可以这样定义它:

data class Plus(val id: Long, val a: Term, val b: Term) : Term()

或者更像@marstran 的建议
data class Entity(val id: Long, val value: Any)

@marstran 和 @gidds 解决方案很实用并且可以完成工作,但我认为你应该小心不要让你的代码困惑。 IdentityHashMap javadoc 中甚至还有这个警告: 这个类不是一个通用的 Map 实现!虽然这个类实现了 Map 接口(interface),但它故意违反了 Map 的一般契约(Contract),该契约(Contract)要求在比较对象时使用 equals 方法。此类仅在需要引用相等语义的极少数情况下使用。

关于Kotlin 集合 : Can you optionally key data classes by identity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62060640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com