आप दो अलग-अलग भागों, = के बाएं हाथ की ओर और अधिकार के रूप में निम्न पंक्ति को देखने के लिए है:
val oB: Option[B] = collectFirstOf(List(new A,new B))
क्या तुम यहाँ की उम्मीद कर रहे है कि collectFirstOf अभिव्यक्ति के प्रकार (रावल्यू) मूल्य ओबी के प्रकार से अनुमानित किया जाना चाहिए। कंपाइलर ऐसा नहीं कर सकता है। आपको विशेष रूप से कहना है कि आप किस प्रकार की उम्मीद कर रहे हैं। निम्नलिखित उदाहरण लें:
val v: Long = 1 + 4
अभिव्यक्ति का प्रकार 1 + 4 एक इंट है। यह int तब एक लांग में परिवर्तित हो जाता है। कंपाइलर यह नहीं अनुमान लगाता है कि आप 1 या 4 को लंबे समय तक रखना चाहते हैं:
तो, अपनी समस्या को ठीक करने के लिए, आपको संकलक को यह बताना होगा कि आप किस प्रकार की अपेक्षा कर रहे हैं, अन्यथा यह मानता है java.lang.Object:
val oB = collectFirstOf[B](List(new A,new B))
तो प्रकट सही ढंग से सौंप दिया जाता है, और पूरी दुनिया के साथ अच्छी तरह से है। तो क्यों भी निम्नलिखित है संकलन: पहली नजर में
val oB:Option[B] = collectFirstOfT(List(new A,new B))
oB: Option[B] = Some([email protected])
, तो वह ऐसा प्रतीत होता है नहीं काम करना चाहिए, लेकिन यह नहीं करता है। इसका कारण यह है collectFirstOfT वास्तव में एक विकल्प [कुछ भी नहीं है], जो सुरक्षित रूप से एक विकल्प [बी] में बदला जा सकता रिटर्न है:
scala> val f = collectFirstOfT(List(new A,new B))
f: Option[Nothing] = Some([email protected])
scala> f.asInstanceOf[Option[B]]
res4: Option[B] = Some([email protected])
स्रोत
2012-04-12 12:44:29
अच्छा पकड़ो! मैं फ़ंक्शन को याद करने से कैसे रोक सकता हूं? (आदर्श, इसे संकलित नहीं करना चाहिए) – jwinandy
एक त्वरित और आसान तरीका एक स्पष्ट तर्क जोड़ना होगा, कक्षा: संग्रह फर्स्टऑफटी [टी] (सीएलएस: कक्षा [टी], ला: सूची [_]), फिर कॉल करें: संग्रह फर्स्टऑफटी (कक्षा ओएफ [बी], सूची (नया ए, नया बी))। यह अपेक्षित के रूप में एक विकल्प [बी] वापस करेगा। –