2012-03-02 12 views
7

नहीं देता मैं स्काला के लिए नया हूँ, और मैं क्यों मैं कभी कभी एक प्रकार की त्रुटि जब Set.containsस्काला Set.contains की उम्मीद प्रकार मेल नहीं खाता त्रुटि

को गलत तर्क की आपूर्ति नहीं मिलता है समझने के लिए संघर्ष कर रहा हूँ

scala> val baz = Map("one" -> 1, "two" -> 2) 
baz: scala.collection.immutable.Map[java.lang.String,Int] = Map(one -> 1, two -> 2) 

scala> baz.values.toSet.contains("asdf") 
res3: Boolean = false 

मैं एक प्रकार मेल नहीं खाता वहाँ क्यों नहीं मिला: यहाँ एक त्वरित उदाहरण आरईपीएल (2.9.1.final) का उपयोग कर रहा है?

scala> val bling = baz.values.toSet 
bling: scala.collection.immutable.Set[Int] = Set(1, 2) 

scala> bling.contains("asdf") 
<console>:10: error: type mismatch; 
found : java.lang.String("asdf") 
required: Int 
       bling.contains("asdf") 
          ^

बेवकूफ गलती, भाषा सूक्ष्मता, या संकलक बग:

अगर मैं एक और val करने के लिए baz.values.toSet असाइन करते हैं, और उस पर contains कहते हैं, मैं प्रकार की जाँच मिलता है ?

+0

लघु जवाब: भाषा सूक्ष्मता (subtyping और प्रकार निष्कर्ष) –

उत्तर

12

ठीक है, तो Set अपने प्रकार पैरामीटर में अपरिवर्तनीय है और यह वास्तव में की तरह काम करता यह होना चाहिए

scala> Set(1, 2, 3) contains "Hi" 
<console>:8: error: type mismatch; 
found : java.lang.String("Hi") 
required: Int 
       Set(1, 2, 3) contains "Hi" 
            ^

लेकिन आप की तरह कहते हैं,:

scala> Map('a -> 1, 'b -> 2, 'c -> 3).values.toSet contains "Hi" 
res1: Boolean = false 

केवल निष्कर्ष हम यथोचित करने के लिए आ सकते हैं प्रश्न में Set का प्रकार Set[Int] है। क्या होता है यदि हम स्पष्ट रूप से स्कैला को बताते हैं कि हम Set[Int] चाहते हैं? एक स्पष्ट प्रकार पैरामीटर के साथ कोड के एक ही हिस्से सिर्फ ठीक काम करता है (यानी यह संकलन नहीं करता है):

scala> Map('a -> 1, 'b -> 2, 'c -> 3).values.toSet[Int] contains "Hi" 
<console>:8: error: type mismatch; 
found : java.lang.String("Hi") 
required: Int 
       Map('a -> 1, 'b -> 2, 'c -> 3).values.toSet[Int] contains "Hi" 
                     ^

मुद्दा अनुमानित प्रकार पैरामीटरtoSet विधि करने के लिए पारित किया जा रहा है। स्काला स्पष्ट रूप से खाते में contains "Hi" ले रहे हैं और के लब का निष्कर्ष निकालते है Int और String (यानी Any)

+0

आप कह रहे हैं कि स्काला *** बाद के उपयोग से निष्कर्ष निकालते है * ** सेट के प्रकार का सेट पैरामीटर कुछ व्यापक होना चाहिए, जैसे 'Any'? –

+0

अरे, मुझे इसे हराया। आपके लिए +1 कुछ और स्पष्टीकरण यह है कि जब आप 'baz.values.toSet.contains (" asdf ") कहते हैं, तो यह निकटतम प्रकार मिलता है जो '[X>: Int]' को संतुष्ट करता है, और यह' X' है 'कोई भी ', जिसका अर्थ है कि आपके 'toSet' का परिणाम' सेट [कोई भी] 'है। इस वजह से, आपको स्पष्ट रूप से कहना चाहिए कि आप किस प्रकार के सेट को चाहते हैं, जैसे कि ऑक्सबो ने उल्लेख किया था। – Dylan

+0

क्या आपको यह समझाया नहीं जाना चाहिए कि यह 'सेट' के प्रकार को 'किसी भी' के रूप में बता रहा है? –

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