2013-03-09 8 views
13

एक वर्ग एक convariant प्रकार पैरामीटर Iterable[+A] रूप में इस तरह है, तो वहाँसमझौता स्केला किसी भी बनाम के _/कुछ भी नहीं

def foo(bar: Iterable[_]) 

और

def foo(bar: Iterable[Any]) 

की घोषणा के बीच कोई अंतर है?


एक वर्ग एक contravariant प्रकार पैरामीटर Growable[-A] रूप में इस तरह है, तो वहाँ

def foo(bar: Growable[_]) 

और

def foo(bar: Growable[Nothing]) 

की घोषणा के बीच कोई अंतर है?

+2

[स्केल - जेनेरिक में किसी भी बनाम अंडरस्कोर] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/15186520/scala-any-vs-underscore-in-generics) –

+0

कोई सटीक डुप्लिकेट नहीं है, लेकिन पर्याप्त बंद है। मैं दूसरों को न्याय दूंगा। –

उत्तर

4

जेनेरिक पैरामीटर बाध्य होने पर यह थोड़ा अंतर बनाता है। उदाहरण के लिए, यदि आप

class BoundedIterable[+A <: Something] 
class BoundedGrowable[-A >: Something] 

था तो BoundedIterable[Any] टाइप करें और BoundedGrowable[Nothing] अवैध होगा।

मुझे नहीं पता कि कोई अन्य अंतर है या नहीं, लेकिन मैं यह सुनिश्चित कर सकता हूं कि जहां भी संभव हो, आपको वाइल्डकार्ड-कम संस्करण पसंद करना चाहिए। इसका कारण यह है कि, वास्तव में, घोषणापत्र-साइट प्रकार भिन्नता का उद्देश्य उद्देश्य वाइल्डकार्ड से छुटकारा पाने के लिए है (जो उपयोग-साइट भिन्नता का एक रूप है)। जब आप List[Any] कहते हैं तो "कुछ भी सूची" का मतलब है, लेकिन जब आप List[_] कहते हैं तो आपका मतलब है "हम जो नहीं जानते हैं" क्या है। तो पूर्व सिर्फ एक और तरीका स्पष्ट है, भले ही वे किसी विशेष मामले में समकक्ष हो।

+0

यदि कोई प्रकार पैरामीटर 'कुछ' से बंधे हैं, तो हम 'किसी भी'/'कुछ भी नहीं' के स्थान पर 'कुछ' का उपयोग कर सकते हैं। ऐसे मामले में, हम 'def foo (बार: MyBoundedType [Something])' लिख सकते हैं (दोनों कॉन्वर्सेंट और contravariant मामले के लिए)। –

+0

@ पीटर यह सच है। यही कारण है कि मैंने इसे "थोड़ा" अंतर कहा :) – ghik

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