私は、整数リストの簡単な代数的データ型を宣言したいと言う:Kotlinでは、コンストラクタパラメータがゼロのデータクラスをどのように宣言しますか?
sealed class IntList
data class Cons(val head: Int, val tail: IntList): IntList()
data class Nil() : IntList()
しかし、エラーの最後の宣言の結果が
を持っている必要がありますデータクラスは、少なくとも1つの第一級のコンストラクタパラメータ
- なぜこの制限がありますか?ドキュメントを見ると、データクラスのコンストラクタにnullでないものを要求するための優れた技術的な理由はないようです。
定型のコードをたくさん書かなくても、無意味なコンストラクタを表現することはできますか?私は
sealed class Nil() : IntList()
のようなものに最後の宣言を変更した場合、私は
data class
宣言と無料で来hashCode()
とequals()
の自由な実装を失います。
EDIT
アレックスフィラトフは以下の素敵な短い溶液を得ました。もちろん、あなたはNil
の複数のインスタンスを必要としませんので、私たちのリストは型パラメータによってパラメータ化された場合、私たちはシングルトンオブジェクトに
object Nil : IntList()
を定義することができますしかし、私たちは何をしますか?それは我々が時A
ための具体的な種類を提供する必要があるため、今私たちの定義の最初の2行は、
sealed class List<A>
data class Cons<A>(val head: A, val tail: List<A>): List<A>()
は、私たちはどんなA
ためList<A>
から派生した多型シングルトンNil
オブジェクトを宣言することはできませんでしょう、です宣言。 (this postから取られた)ソリューションは、共変の型パラメータとしてA
を宣言し、次のようにList<Nothing>
のサブタイプとしてNil
を宣言することです:
sealed class List<out A>
data class Cons<A>(val head: A, val tail: List<A>): List<A>()
object Nil : List<Nothing>()
これはdata class
ので、私たちはデータなし
val xs: List<Int> = Cons(1, Cons(2, Nil))
val ys: List<Char> = Cons('a', Cons('b', Nil))
関連:https://stackoverflow.com/questions/37873995/how-to-create-empty-constructor-for-data-class-in-kotlin-androidしかし、あなたの状況に合っていないようです。 – BakaWaii
また、 "一次コンストラクタで宣言されていないプロパティは、等価チェックとハッシュコード計算に参加しません。" – BakaWaii
@UlrikRasmussenなぜhashCode()とequals()が必要なのですか?クラスにはフィールドが含まれていないはずですか? –