2016-04-20 35 views
12

में बीजगणितीय डेटा प्रकार मैं कोटलिन में बीजगणित डेटा प्रकारों का उपयोग करने का तरीका जानने का प्रयास कर रहा हूं, इसलिए मैं निम्नलिखित मूलभूत बाइनरी ट्री प्रकार को लागू करने की कोशिश कर रहा हूं।कोटलिन

sealed class Tree<T>{ 
    class Node<T>(val left: Tree<T>, val right: Tree<T>): Tree<T>() 
    class Leaf<T>(val value: T): Tree<T>() 
} 

यह सब ठीक है, और मेरा पीछा पेड़ का निर्माण कर सकते हैं:

val myTree1: Tree<Int> = Node(Leaf(4), Leaf(2)) 

हालांकि मैं एक "खाली" प्रकार के रूप में अच्छी तरह से करना चाहते हैं, तो मैं निम्नलिखित व्यक्त कर सकते हैं:

sealed class Tree<T>{ 
    class Node<T>(val left: Tree<T>, val right: Tree<T>): Tree<T>() 
    class Leaf<T>(val value: T): Tree<T>() 
    object Empty: Tree() 
} 
:
val myTree1: Tree<Int> = Node(Node(Leaf(4), Leaf(3)), Empty) 

मैं निम्नलिखित की कोशिश की

हालांकि मुझे त्रुटि मिलती है कि टाइप तर्क तर्क वस्तु पर अपेक्षित है खाली: वृक्ष(), जो वास्तव में काफी तार्किक है।

मैं

object Empty: Tree<T>() 

की कोशिश की लेकिन यह "समाधान नहीं किया गया संदर्भ: टी" में हुई। एक अंतिम उपाय के रूप में, मैं

object Empty<T>: Tree<T>() 

लेखन की कोशिश की लेकिन संकलक कहते हैं, "प्रकार पैरामीटर वस्तुओं के लिए अनुमति नहीं है"

वहाँ Kotlin में यह व्यक्त करने के लिए एक तरीका है? खाली एक सिंगलटन होना चाहिए, यही कारण है कि यह एक वस्तु होना चाहिए। इसे एक वर्ग बनाकर, यह संकलक समस्याओं को हल करता है, लेकिन फिर मुझे इसके बाद कोष्ठक रखना होगा => खाली()। इसके अलावा, यह अनावश्यक वस्तुओं को बनाता है, जबकि यह वास्तव में एक सिंगलटन मान होना चाहिए।

मैं इस मुद्दे पर किसी भी मदद की सराहना करता हूं। :)

उत्तर

14

सबसे पहले आपको Tout पैरामीटर बनाने की आवश्यकता है। फिर आप का उपयोग Empty के लिए एक प्रकार तर्क के रूप में कर सकते हैं।

sealed class Tree<out T>{ 
    class Node<T>(val left: Tree<T>, val right: Tree<T>): Tree<T>() 
    class Leaf<T>(val value: T): Tree<T>() 
    object Empty: Tree<Nothing>() 
} 

Nothing Kotlin में एक विशेष प्रकार का है, जो एक उदाहरण नहीं हो सकता है और अन्य सभी प्रकार की एक उप-प्रकार है। तो मैं कहूंगा कि यह कोटलिन प्रकार पदानुक्रम में Any के विपरीत है।

+2

यह काम करता है, धन्यवाद! इसके अलावा, मैंने कुछ भी नहीं के बारे में कुछ सीखा। :) – pjozsef

+0

आपको यहां 'आउट' की आवश्यकता नहीं है - यह इसके बिना काम करता है। कृपया स्पष्ट करें कि – voddan

+2

@ वोददान यदि आप 'आउट' को हटाते हैं तो 'पत्ता' और 'खाली' के साथ 'नोड' बनाना असंभव हो जाएगा। – Michael