Non, data
Les classes n'ont aucune représentation spécifique dans le système de types et ne peuvent pas être distinguées des classes normales (similar question).
Vous pouvez, cependant, exiger les méthodes data
classe avec un certain nombre de composants a l'aide d'une interface (en fait ce sera une interface de marqueur sur data
classes).
Voici un exemple pour data
cours avec deux composantes:
interface Data2<T1, T2> {
operator fun component1(): T1
operator fun component2(): T2
fun copy(t1: T1, t2: T2): Data2<T1, T2>
}
toString
, hashCode
et equals
peuvent être appelés sur tout type de toute façon.
Ensuite vient marquer votre data
classe avec l'interface:
data class Impl(val i: Int, val s: String): Data2<Int, String>
val d: Data2<Int, String> = Impl(1, "2")
val (c1, c2) = d
val copy = d.copy(-1, d.component2())
fonction copy
n'est pas de type sécurisé complètement parce que Kotlin doesn't have self type (et aucun moyen d'exiger des implémentations d'interface pour être sous-type d'un type spécifique), mais si vous ne marquez que vos classes data
, cela devrait fonctionner (voir une autre option ci-dessous).
Un autre inconvénient est que vous perdez les paramètres par défaut de copy
méthode et doivent appeler tous les paramètres spécifiés:
val d = myD2.copy(newValue, myD2.component2())
Une autre option consiste à définir ces interfaces comme Data2<T1, T2, out Self>
, class Impl(...): Data2<..., Impl>
et make copy
renvoie Self
, mais cela ne le rendra pas meilleur si vous utilisez l'interface Data2<SomeType, SomeType, *>
.