2016-12-20 17 views
7

में समझौता प्रकार inferrence मैं निम्नलिखित साधारण प्रोग्राम लिखा है:स्काला

import java.util.{Set => JavaSet} 
import java.util.Collections._ 

object Main extends App { 
    def test(set: JavaSet[String]) =() 

    test(emptySet()) //fine 
    test(emptySet) //error 
} 

DEMO

और वास्तव में आश्चर्यचकित था अंतिम पंक्ति test(emptySet) संकलित नहीं किया गया। क्यूं कर? test(emptySet()) के बीच क्या अंतर है? मैंने सोला में सोचा था कि हम ऐसे मामलों में स्वतंत्र रूप से ब्रांड्स को छोड़ सकते हैं।

उत्तर

4

स्काला विनिर्देश में Method Conversions देखें:

निम्नलिखित चार अंतर्निहित रूपांतरण तरीकों जो कुछ तर्क सूची के लिए लागू नहीं कर रहे हैं के लिए लागू किया जा सकता है।

मूल्यांकन

एक parameterless विधि मीटर प्रकार के => टी हमेशा अभिव्यक्ति का मूल्यांकन करने के लिए जो मीटर ही है द्वारा टी टाइप करने के लिए बदल जाती है।

अंतर्निहित आवेदन

विधि केवल निहित मापदंडों लेता है, अंतर्निहित तर्क नियम यहाँ निम्नलिखित पारित कर रहे हैं।

एटा विस्तार

अन्यथा, अगर विधि एक निर्माता नहीं है, और उम्मीद प्रकार pt एक समारोह प्रकार (टी ') ⇒T' है, ईटा-विस्तार पर अभिव्यक्ति ई किया जाता है।

खाली आवेदन

अन्यथा, यदि ई विधि प्रकार है() टी, यह परोक्ष खाली तर्क सूची के लिए लागू किया जाता है, उपज ई()।

जो आप चाहते हैं वह "खाली एप्लिकेशन" है, लेकिन यह केवल तब लागू होता है जब पहले के कोई भी रूपांतरण नहीं होते हैं, और इस मामले में "ईटा विस्तार" इसके बजाय होता है।

संपादित करें: यह गलत था और @ जैस्पर-एम की टिप्पणी सही है। कोई ईटा-विस्तार नहीं हो रहा है, "खाली एप्लिकेशन" वर्तमान में सामान्य तरीकों के लिए अपरिहार्य है।

+0

लेकिन 'टेस्ट (खालीसेट) '-' जावासेट [कुछ भी नहीं]' में अनुमानित प्रकार क्यों है? –

+1

त्रुटि संदेश से, यह नहीं है। यदि आपका मतलब है कि आईडीईए इस प्रकार से दिखाता है, तो यह गलत है। टाइपिंग करते समय आप आईडीईए की दिखाए गए त्रुटियों और अनुमानित प्रकारों पर भरोसा नहीं कर सकते हैं, हमेशा पहले कोड बनाने का प्रयास करें। –

+0

बस अपनी रिपोर्ट पढ़ें। इसलिए, दूसरे मामले में भी काम करना चाहिए था, है ना? –