2010-08-07 8 views
7

में तर्क के रूप में कुछ भी नहीं की आवश्यकता है यहाँ code-java.util.concurrent.LinkedBlockingQueue डाल विधि स्काला

import java.util.concurrent.LinkedBlockingQueue 

def main(args:Array[String]) { 
    val queue=new LinkedBlockingQueue 
    queue.put("foo") 
} 

का एक टुकड़ा यह मैं देता है -

त्रुटि: प्रकार मेल नहीं खाता;
पाया: java.lang.String ("foo")
आवश्यक: कुछ नहीं
queue.add ("foo")

मेरे समझ की वजह से मुझे तत्वों के प्रकार में जाने को निर्दिष्ट नहीं इसकी है कतार। यदि ऐसा है, तो हम डिफ़ॉल्ट जेनेरिक लोगों के बजाय LinkedBlockingQueue के लिए स्कैला में प्रकार कैसे निर्दिष्ट करते हैं?

+0

ध्यान दें कि डिफ़ॉल्ट प्रकार _not_ सामान्य है। इसके बजाए, यह सबसे विशिष्ट प्रकार संभव है। :-) –

उत्तर

3

जब आप किसी प्रकार हस्ताक्षर नहीं दे रहे हों, लेकिन एक की जरूरत है, स्काला सबसे प्रतिबंधात्मक हस्ताक्षर संभव का उपयोग करता है। चूंकि Nothing सभी के अधिकांश प्रतिबंधात्मक (कुछ भी नहीं Nothing हो सकता है!), स्काला चुनता LinkedBlockingQueue[Nothing]

लेकिन इस में मामला, प्रतिबंध का मतलब है कि आप वास्तव में पु नहीं कर सकते हैं इस अत्यधिक प्रतिबंधक कतार में कुछ भी नहीं।

आप पहले से ही पता चला है के रूप में, समाधान संग्रह में कक्षाओं का प्रकार निर्दिष्ट करने के लिए है:

val queue = new LinkedBlockingQueue[String] 

लेकिन ध्यान दें कि प्रकार inferencer का पालन करते हुए अन्य मामलों में सही प्रकार पता लगा सकते हैं " यथासंभव प्रतिबंधक "नियम। उदाहरण के लिए यदि initial एक और जावा संग्रह है कि स्ट्रिंग से युक्त के रूप में लिखा गया हो,

val queue = new LinkedBlockingQueue(initial) 

बस, काम के रूप में यह initial से String प्रकार दूर पढ़ होगा है।

1

मैंने सही अनुमान लगाया। दिखाया गया है प्रकार निर्दिष्ट किया जाना चाहिए -

val queue=new LinkedBlockingQueue[String] 
1

जावा कच्चे प्रकार पश्चगामी संगतता और उनके उपयोग पर विचार बुरा शैली के लिए एक रियायत है। स्कैला में आपके पास कच्चे प्रकार नहीं हैं, इसलिए आपको या तो उन्हें निर्दिष्ट करना होगा या टाइप इनफ्रेंसर उन्हें अनुमान लगाने में सक्षम होना चाहिए। ध्यान दें कि आप भी बाईं ओर पैरामीट्रिक प्रकार निर्दिष्ट कर सकते हैं:।

val queue:LinkedBlockingQueue[String] = new LinkedBlockingQueue() 

कि यहाँ बहुत ज्यादा नहीं समझ में आता है, लेकिन महत्वपूर्ण है अगर आप एक अलग प्रकार (करना चाहते हैं जैसे अपने चर के लिए Queue[String]