gpt4 book ai didi

kotlin - 在 Kotlin 中,如何声明一个构造函数参数为零的数据类?

转载 作者:IT老高 更新时间:2023-10-28 13:37:53 31 4
gpt4 key购买 nike

假设我想为整数列表声明一个简单的代数数据类型:

sealed class IntList
data class Cons(val head: Int, val tail: IntList): IntList()
data class Nil() : IntList()

但是,最后的声明导致错误

Data class must have at least one primary constructor parameter

  1. 为什么会出现这种限制?查看文档,似乎没有很好的技术理由要求数据类构造函数是非空的。
  2. 是否可以在不必编写大量样板代码的情况下表达空构造函数?如果我将最后一个声明更改为类似

    sealed class Nil() : IntList()

    然后我失去了 hashCode() 的免费实现和 equals()免费提供 data class声明。

编辑

Alex Filatov 在下面给出了一个很好的简短解决方案。显然,您永远不需要超过一个 Nil 的实例。 ,所以我们可以只定义一个单例对象

object Nil : IntList()

但是,如果我们的列表由类型参数参数化,我们会怎么做?也就是说,现在我们定义的前两行将是

sealed class List<A>
data class Cons<A>(val head: A, val tail: List<A>): List<A>()

我们不能声明多态单例 Nil派生自 List<A> 的对象对于任何 A , 因为我们必须为 A 提供一个具体的类型申报时。解决方案(取自 this post )是声明 A作为协变类型参数并声明 Nil作为 List<Nothing> 的子类型如下:

sealed class List<out A>
data class Cons<A>(val head: A, val tail: List<A>): List<A>()
object Nil : List<Nothing>()

这让我们可以写

val xs: List<Int> = Cons(1, Cons(2, Nil))
val ys: List<Char> = Cons('a', Cons('b', Nil))

最佳答案

因为 data class 没有数据是没有意义的。对单例使用 object:

object Nil : IntList()

关于kotlin - 在 Kotlin 中,如何声明一个构造函数参数为零的数据类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46152525/

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