2017-05-30 8 views
2

iはクラスなぜKotlin修飾子 'open'は 'data'と互換性がありませんか?

open data class Person(var name: String) 

と別のクラスこれは私に

error: modifier 'open' is incompatible with 'data'

iはPersonクラスの罰金からデータを削除する場合は、そのエラーを与える

data class Student(var reg: String) : Person("") 

を持っています。

なぜkotlinが開いてデータに互換性がないのですか? https://kotlinlang.org/docs/reference/data-classes.htmlから

答えて

8

To ensure consistency and meaningful behavior of the generated code, data classes have to fulfil the following requirements:

  • The primary constructor needs to have at least one parameter;
  • All primary constructor parameters need to be marked as val or var;
  • Data classes cannot be abstract, open, sealed or inner;
  • (before 1.1) Data classes may only implement interfaces.

したがって要点は、データクラスは、いくつかのコード(equalshashCodecopytoStringcomponentN関数)を生成していることです。そして、そのようなコードはプログラマーによって壊されてはならない。その結果、データクラスにはいくつかの制限があります。 documentation状態、

  • Data classes cannot be abstract, open, sealed or inner;

として、彼らから継承することができないという理由は、データクラスから継承する(などequalshashcode、)どのように彼らの生成方法で問題/曖昧さを引き起こすことがある

3

必要があります作業。このhereの詳細については、こちらを参照してください。

以降、データクラスの制限がわずかに緩和されました。これらは、関連するproposalで詳細に説明されているように、他のクラスから継承できます。しかし、彼らはまだクラス自身から継承することはできません。


データクラスは "唯一"、自動equalsの余分な利便性を提供hashcodetoStringcomponent、およびcopy機能することに注意してください。それらを必要としない場合、次のようなクラスはgetter/setterを持つプロパティと非常に短い形式のコンストラクタを持ち、継承でどのように使用できるかに制限はありません:

class User(val name: String, var age: Int) 
関連する問題