在Kotlin中,如何声明构造函数参数为零的数据类?
假设我想为整数列表声明一个简单的代数数据类型:在Kotlin中,如何声明构造函数参数为零的数据类?,kotlin,Kotlin,假设我想为整数列表声明一个简单的代数数据类型: sealed class IntList data class Cons(val head: Int, val tail: IntList): IntList() data class Nil() : IntList() 但是,最后一次声明会导致错误 数据类必须至少有一个主构造函数参数 为什么存在这种限制?查看文档,似乎没有很好的技术理由要求数据类构造函数为非空 不必编写大量样板代码就可以表示空构造函数吗?如果我将最后一个声明更改为 sealed
sealed class IntList
data class Cons(val head: Int, val tail: IntList): IntList()
data class Nil() : IntList()
但是,最后一次声明会导致错误
数据类必须至少有一个主构造函数参数
sealed class Nil() : IntList()
然后我就失去了hashCode()
和equals()
的免费实现,它们是通过数据类
声明免费提供的Nil
实例,因此我们可以只定义一个单例对象
object Nil : IntList()
但是,如果列表由类型参数参数参数化,我们会怎么做?也就是说,我们定义的前两行是
sealed class List<A>
data class Cons<A>(val head: A, val tail: List<A>): List<A>()
这使我们能够写作
val xs: List<Int> = Cons(1, Cons(2, Nil))
val ys: List<Char> = Cons('a', Cons('b', Nil))
val xs:List=Cons(1,Cons(2,Nil))
val ys:List=Cons('a',Cons('b',Nil))
因为没有数据的数据类
没有意义。对单例使用对象
:
object Nil : IntList()
您必须创建一个普通类
class Nil : IntList()
然后自己实现hashCode()
和equals()
没有字段的数据类没有任何意义,因为它的任务是表示数据
或者:您可以使用一个对象类(如上所述),它是单个实例类。因为,您不需要每个Nil
实例都有一个状态,它们可以共享一个状态。如果您确实希望源代码中的一致性,可以使用默认值来尽可能减少数据类型
data class Nil(val _u: Byte = 0) : IntList()
或
相关:但这似乎不适合您的情况。另外,“请注意,主构造函数中未声明的属性不参与相等检查和hashcode计算。”@ulrikrasussen为什么需要hashcode()
和equals()
如果类不应包含任何字段?如果我想比较两个列表。但这只是在可能存在Nil的不同实例时才存在的问题。通过将Nil表示为单例,这些方法的默认实现将suffice@UlrikRasmussen请将您的编辑作为答案发布!:)答案不应该出现在问题中,这对我的用例很有效,它是一个没有类型参数的简单代数数据类型。但是,我如何为参数化类型表示空构造函数呢?例如,让我们用cons构造函数数据类cons(val h:A,val t:List):List()
将其推广到密封类列表。我无法声明多态对象对象Nil:List()
我找到了解决方案并相应地更新了问题
data class Nil(val _u: Byte = 0) : IntList()
data class Nil(val _u: Nothing? = null) : IntList()