Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Kotlin中,如何声明构造函数参数为零的数据类?_Kotlin - Fatal编程技术网

在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()