2011-10-16 17 views
14

का विस्तार नहीं करता है, मैं एक जेनेरिक को परिभाषित करना चाहता हूं कि इसका प्रकार पैरामीटर किसी दिए गए प्रकार का विस्तार नहीं करता है।टाइप पैरामीटर दिए गए प्रकार

उदाहरण के लिए

,

trait myTrait[T <: Throwable] { 
    // .... 
} 

एक विशेषता है जहां इसकी प्रकार पैरामीटर फैली फेंकने योग्य परिभाषित करेगा।

trait myTrait[T Not(<:) Throwable] { 
    // .... 
} 

कहाँ प्रकार प्रकार पैरामीटर फेंकने योग्य विस्तार नहीं करता है: मैं की तरह कुछ (नहीं असली स्काला कोड) चाहते हैं। क्या स्कैला में ऐसी धारणा बनाने का कोई तरीका है?

+3

अजीब बात है आप से पूछना चाहिए, माइल्स सबिन _just_ ने धागे के नीचे स्कैला-भाषा सूची पर इसका उत्तर पोस्ट किया "यह लागू करना कि फ़ंक्शन कुछ (यूनिट के अलावा) कुछ देता है": http://groups.google.com/group/scala-language/browse_thread/thread/e1242dfa7d65f599 –

उत्तर

21

आप implicits का उपयोग कर ऐसी चीज कर सकते हैं। यहाँ स्केला-भाषा पर मीलों साबिन से एक चाल है:

// Encoding for "A is not a subtype of B" 
trait <:!<[A, B] 

// Uses ambiguity to rule out the cases we're trying to exclude 
implicit def nsub[A, B] : A <:!< B = null 
implicit def nsubAmbig1[A, B >: A] : A <:!< B = null 
implicit def nsubAmbig2[A, B >: A] : A <:!< B = null 

// Type alias for context bound 
type NOT[T] = { 
type Lambda[U] = U <:!< T 
} 

// foo does not accept T of type Unit 
def foo[T : NOT[Unit]#Lambda](t : T) = t 
+0

यदि आप पहले से ही 'आकारहीन' लाइब्रेरी का उपयोग करते हैं तो आप कर सकते हैं: 'def foo [टी: | ¬ | [यूनिट] # λ] (टी: टी) = टी' या, दो पंक्तियों में:' NotUnit टाइप करें [ टी] = | ¬ | [यूनिट] # λ [टी] 'और' foo [टी: NotUnit] (टी: टी) = टी' – VasyaNovikov

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