gpt4 book ai didi

Kotlin:Intrinsics.areEqual 无限循环(堆栈溢出)

转载 作者:行者123 更新时间:2023-12-04 02:12:35 27 4
gpt4 key购买 nike

java.lang.StackOverflowError
at kotlin.jvm.internal.Intrinsics.areEqual(Intrinsics.java:164)
at plugin.interaction.inter.teleports.Category.equals(Category.kt)
at kotlin.jvm.internal.Intrinsics.areEqual(Intrinsics.java:164)
at plugin.interaction.inter.teleports.Destination.equals(Destination.kt)

发生在 .equals两个非关系数据类之间的比较。

主要错误。
data class Category(val name: String, val destinations: MutableList<Destination>)

data class Destination(val category: Category, val name: String)

最佳答案

Data classes in Kotlin are just syntactic sugar for Java POJOs.

您示例中的主要罪魁祸首是这个循环:
val destinations: MutableList<Destination>Category &val category: CategoryDestination
您必须通过将两个变量中的任何一个移出主数据类构造函数来消除此循环。

然而,还有一个更大的副作用:data class Category(..)可变 ,这将导致它(以及在其主构造函数中使用类别的任何其他数据类!)在任何基于散列的集合中用作键是不安全的。有关更多信息,请参阅:Are mutable hashmap keys a dangerous practice?

鉴于数据类用于纯数据,我建议删除 val category: Categorydata class Destination(..) , 并更改 val destinations: MutableList<Destination> 的类型在 data class Category(..)为只读 List<Destination> .为了在上述更改后打破不可变状态,您必须从 Kotlin 执行不安全的强制转换或从 Java 创建该类的实例。

但是,如果您绝对需要对目的地中的类别进行反向引用(并且不在 hashmaps/-sets/等中使用您的类),您可以将 Destination 设为常规类并自己实现 equals/hashCode,或者将类别移出主要构造函数。这有点棘手,但可以使用辅助构造函数完成:

data class Destination private constructor(val name: String) {
private lateinit var _category: Category
val category get() = _category
constructor(category: Category, name: String) : this(name) {
_category = category
}
}

关于Kotlin:Intrinsics.areEqual 无限循环(堆栈溢出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45041834/

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