नहीं, data
कक्षाओं में टाइप सिस्टम में कोई विशिष्ट प्रतिनिधित्व नहीं है और नियमित कक्षाओं (similar question) से अलग नहीं किया जा सकता है।
हालांकि, आपको data
कक्षा के तरीकों की आवश्यकता हो सकती है, जिसमें कुछ संख्याओं के घटक इंटरफ़ेस का उपयोग कर रहे हैं (वास्तव में यह data
कक्षाओं पर मार्कर इंटरफ़ेस होगा)।
यहाँ दो घटकों के साथ data
कक्षाओं के लिए एक उदाहरण है:
interface Data2<T1, T2> {
operator fun component1(): T1
operator fun component2(): T2
fun copy(t1: T1, t2: T2): Data2<T1, T2>
}
toString
, hashCode
और equals
वैसे भी किसी भी प्रकार पर कहा जा सकता है।
तो बस इंटरफ़ेस के साथ अपने data
वर्ग का प्रतीक:
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())
copy
समारोह पूरी तरह से टाइप-सुरक्षित नहीं है, क्योंकि Kotlin doesn't have self type (और कोई रास्ता नहीं है एक विशेष प्रकार के उप प्रकार होने के लिए इंटरफेस कार्यान्वयन की आवश्यकता होती है), लेकिन अगर आप केवल data
कक्षाओं को इसके साथ चिह्नित करते हैं, तो इसे काम करना चाहिए (नीचे एक और विकल्प देखें)।
val d = myD2.copy(newValue, myD2.component2())
एक अन्य विकल्प Data2<T1, T2, out Self>
, class Impl(...): Data2<..., Impl>
के रूप में इन इंटरफेस को परिभाषित करने के लिए है, और:
एक और दोष यह है कि आप copy
विधि के डिफ़ॉल्ट पैरामीटर खो देते हैं और सभी मापदंडों निर्दिष्ट से कॉल करने के लिए है है copy
Self
लौटें, लेकिन अगर आप Data2<SomeType, SomeType, *>
के रूप में इंटरफ़ेस का उपयोग करते हैं तो यह बेहतर नहीं होगा।