gpt4 book ai didi

kotlin - Kotlin 数据类中的循环引用可能会产生堆栈溢出错误

转载 作者:行者123 更新时间:2023-12-03 16:47:12 37 4
gpt4 key购买 nike

我有一个关于 Kotlin 中数据类的问题。
假设我们有两个带有循环引用的类:

data class Foo(
var bar: Bar? = null
)
data class Bar (
var foo: Foo? = null
)
和主要功能:
fun main() {
val f = Foo()
val b = Bar()
f.bar = b
b.foo = f
f.hashCode()
b.hashCode()
//println(f)
//println(b)
}
Kotlin 自动生成的代码将使 main 函数进入堆栈溢出。您可以在 Kotlin Playground 中尝试此操作.
这是预期的行为吗?请注意,这是一个基本示例,但这将发生在现实生活中,例如,在 Bar 中,我们可以拥有 List、Set 或 Foo 的泛型集合,而不是对 Foo 的引用。
Kotlin 不应该产生某种编译器错误,或者即使在其他语言中也会发生这种情况?
same thing but in Java

最佳答案

这可能被认为是一个错误。 Here是与 Kotlin 开发人员的通信,讨论可能是另一个错误的内容,但重要的一点是:

By default, no specific equals and hashCode are generated (thus, theycheck object identity).

For data classes, hashCode and equals are based on property values.I’ll write algorithm steps in words instead of pseudocode:

hashCode:

  1. Calculate hashCode for each property declared as constructor parameter in current class
  2. Return h1 × 31n−1 + h2 × 31n−2 + … + hn

这就是预期的行为,显然在第 1 步中打破了您的示例。在您使用 Array.hashCode 的“真实”世界示例中可能是解决方案,但似乎在这个人为的解决方案中(尽管我已经看到了诸如此类的构造,这就是 C/++ 中存在前向声明的原因......)。我会把它归档在 https://youtrack.jetbrains.com/issues .他们可能只是告诉您将 hashCode 设置为使用对象 ID 的常规类的默认值。
poipoi发现这实际上是多年前报道的,我错过了: https://youtrack.jetbrains.com/issue/KT-16244
因此具有循环引用的数据类必须提供自己的 toStringhashCode .太糟糕了,这不是记录在案的行为。

关于kotlin - Kotlin 数据类中的循环引用可能会产生堆栈溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65329562/

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