6

स्काला 2.11.2 में, निम्न न्यूनतम उदाहरण केवल जब प्रकार जोड़ना का उपयोग कर Array[String] पर संकलित:स्काला प्रकार निष्कर्ष: IndexedSeq [टी] सरणी से [टी] अनुमान नहीं लगा सकता

object Foo {  

    def fromList(list: List[String]): Foo = new Foo(list.toArray : Array[String]) 

} 

class Foo(source: IndexedSeq[String])  

हैं मैं fromList में टाइप जोड़ना निकालते हैं तो वह निम्न त्रुटि के साथ संकलित करने के लिए असफल हो जायेगी:

Error:(48, 56) polymorphic expression cannot be instantiated to expected type; 
found : [B >: String]Array[B] 
required: IndexedSeq[String] 
    def fromList(list: List[String]): Foo = new Foo(list.toArray) 
                ^

क्यों संकलक Array[String] अनुमान नहीं लगा सकता यहाँ? या क्या इस मुद्दे को Array से IndexedSeq के अंतर्निहित रूपांतरण के साथ कुछ करना है?

+1

नोट मुझे लगता है कि आप कर सकते हैं: 'आपत्ति फू {def fromList (सूची: सूची [स्ट्रिंग]): Foo = नए फू (list.toArray [स्ट्रिंग])} 'बदले में। – david

+0

या बिल्कुल 'list.toIndexedSeq', ज़ाहिर है। सवाल अभी भी एक अच्छा है, यद्यपि। –

+0

इसे इंगित करने के लिए धन्यवाद। इंडेक्सडस्क की बजाय 'ऐरे' के कारण मैं प्रदर्शन कारणों से पूरी तरह से हूं। मुझे फ़ंक्शन को प्रोफाइल करना पड़ा और पाया कि 'बहुत से छोटे उदाहरण बनाते समय वेक्टर का अधिक ओवरहेड लेना। – Chris

उत्तर

4

मुद्दा यह है कि .toArray विधि कुछ प्रकार B जो List[T] में T की एक सुपर क्लास है की एक सरणी देता है। यह आपको List[Bar] पर उपयोग करने की अनुमति देता है जहां बढ़ाता है तो Array[Foo] आवश्यक है।

हां, वास्तविक कारण यह बॉक्स से बाहर नहीं है यह है कि संकलक B का उपयोग करने के लिए और IndexedSeq पर कैसे पहुंचने का प्रयास कर रहा है। ऐसा लगता है कि यह IndexedSeq[String] आवश्यकता को हल करने का प्रयास कर रहा है लेकिन B केवल String या String का सुपरक्लास होने की गारंटी है; इसलिए त्रुटि।

यह मेरा पसंदीदा आसपास काम है:

def fromList(list: List[String]): Foo = new Foo(list.toArray[String]) 
संबंधित मुद्दे