2013-07-11 29 views
5

जब एक sortable डेटा संरचना को लागू करने, मैं इस तरह कुछ करने का सोच रहा था:प्रकार पैरामीटर टी आदेश से घिरा [टी]

trait MaxHeap[T <: Ordering[T]] { 
    def insert(e: T): Unit 
    ... 
} 

लेकिन उस MaxHeap [इंट] की तरह प्रकार के लिए काम नहीं करेंगे। मानक संग्रह पुस्तकालय में, संग्रह का तत्व प्रकार टी बाध्य नहीं है। इसके बजाए, तरीकों के लिए एक अंतर्निहित प्रदान किया जाता है ताकि इसे टी टू ऑर्डरिंग [टी] में परिवर्तित किया जा सके, उदा।

trait Seq[+A] extends ... { 
    // it's Ordering[B], not Ordering[A], but the idea is the same. 
    def max[B >: A](implicit cmp: Ordering[B]): A 
} 

मेरा प्रश्न है, अगर वहाँ मेरी कक्षा/विशेषता में कई तरीके तुलना को शामिल कर रहे हैं, वहाँ वर्ग/विशेषता के तत्व प्रकार निर्दिष्ट करने के लिए तुलनीय होने के लिए इतना है कि मैं उन लोगों के लिए implicits घोषित करने के लिए की जरूरत नहीं है एक तरीका है तरीकों?

उत्तर

5

आप एक अंतर्निहित पैरामीटर है कि आदेश को परिभाषित करता है की घोषणा कर सकता है, और फिर आप अपने सभी तरीकों में इसका इस्तेमाल कर सकते हैं:

class MaxHeap[T](implicit cmp: Ordering[_ >: T]) ... 

यदि यह एक विशेषता है, यह एक पैरामीटर नहीं ले जा सकते हैं, लेकिन

trait Heap[T] { 
    implicit protected val cmp: Ordering[_ >: T]; 
    // ... use cmp in your methods ... 
} 

और उसके बाद प्रत्येक वर्ग का उपयोग करता है यह एक अंतर्निहित पैरामीटर है कि यह ओवरराइड करता है ले जा सकते हैं:

आप एक अंतर्निहित मूल्य के रूप में यह घोषणा कर सकते हैं
class MaxHeap[T](implicit override protected val cmp: Ordering[_ >: T]) 
    extends Heap[T] 
{ 
    // ... 
} 

अद्यतन: कुछ technical reasonsOrdering लिए contravariant नहीं है। यही कारण है कि मैंने Ordering[_ >: T] का उपयोग किया, क्योंकि यह अधिक लचीलापन की अनुमति देता है। आप T के सुपरक्लास के लिए परिभाषित ऑर्डरिंग का उपयोग कर सकते हैं। आप निश्चित रूप से उपयोग कर सकते हैं बस cmp: Ordering[T] है, लेकिन फिर आप की तरह

new MaxHeap[java.lang.Integer]()(new Ordering[java.lang.Number] { 
    // ... 
    }); 

बातें नहीं कर सकते हैं इसके अलावा, Ordering के पूरे विचार है आप T पर किसी भी बाधाओं को लागू करने की जरूरत नहीं है कि। यह अधिक लचीला है और अन्य चीजों के साथ एक ही कक्षा के लिए अलग-अलग तुलना करने की अनुमति मिलती है।

+0

धन्यवाद @ पीटर। लेकिन इस तरह 'टी' तुलनीय होने के लिए लागू नहीं किया गया है जैसे कि यह टाइप पैरामीटर सूची में बाध्य था। कोई भी 'टी' करेगा, बशर्ते एक निहित दिया गया हो। – cfchou

+0

'ऑर्डरिंग [_>: टी]' एक ऐसी तकनीक है जिसे मैंने पहले नहीं देखा है। लेकिन मुझे आश्चर्य है कि 'ऑर्डरिंग [टी]' का उपयोग क्यों नहीं करें। 'ऑर्डरिंग' इम्प्लिकिट्स द्वारा अप्रत्यक्ष रूप से प्रदान किए गए सुविधाजनक ऑपरेटर 'ऑर्डर' के साथ काम नहीं कर रहे हैं 'ऑर्डरिंग [_>: टी] '। – cfchou

+0

@cfchou मैं आपकी टिप्पणियों को हल करने के लिए उत्तर अद्यतन करता हूं। –

संबंधित मुद्दे