Warning about an unchecked type argument in this Scala pattern match? -
यह फाइल:
ऑब्जेक्ट टेस्ट ऐप {xv valj = list (1,2) , 3): ऑब्जेक्ट वैल रेज़ = ओबजे मैच {केस सेक् (1,2,3) = & gt; "प्रथम" केस _ = & gt; "अन्य"} println (res)} इस चेतावनी को देता है:
Test.scala: 6: चेतावनी: गैर चर प्रकार तर्क A में प्रकार पैटर्न Seq [ए] अनियंत्रित है क्योंकि यह विलोपन केस सेक (1,2,3) = & gt; "प्रथम" स्काला संस्करण 2.9.0.1
मुझे नहीं पता कि मैच को कैसे निष्कासित करने के लिए एक मिटाने वाला प्रकार पैरामीटर आवश्यक है। पहला मामला खंड यह पूछने के लिए है कि क्या obj 1, 2, और 3 के बराबर 3 तत्वों के साथ एक सीक है। अगर मैं कुछ लिखा होता :
केस स्ट्रिंग: सीक [स्ट्रिंग] = & gt; ... मुझे चेतावनी क्यों मिलती है, और इसे दूर करने का एक अच्छा तरीका क्या है?
वैसे, मैं किसी वस्तु के स्थैतिक प्रकार के साथ मैच करना चाहता हूं। वास्तविक कोड में मैं कुछ लिस्प का एक उदाहरण पार्स कर रहा हूं- यह एक स्ट्रिंग, अनुक्रमों का अनुक्रम, प्रतीक, संख्या, आदि हो सकता है।
इस दृश्य के पीछे क्या होता है यह कुछ जानकारी है इस कोड पर विचार करें:
वर्ग परीक्षण {नया ऑब्जेक्ट मैच {case x: seq [int] = & gt; सच} नया ऑब्जेक्ट मैच {केस सेक् (1) = & gt; अगर आप scalac -Xprint: 12-जांच किए गए से संकलित करते हैं, तो आपको कोड को विवरणा चरण (आईडी 13) से पहले दिखाई देगा। पहले प्रकार पैटर्न के लिए, आप कुछ ऐसा देखेंगे: & lt; सिंथेटिक & gt; Val temp1: java.lang.Object = new java.lang.Object (); यदि Seq चिमटा पैटर्न के लिए , आप कुछ देखेंगे : <पूर्व> & lt; सिंथेटिक & gt; Val temp3: java.lang.Object = new java.lang.Object (); अगर (temp3.isInstanceOf [सेक [ए]] ()) {& lt; सिंथेटिक & gt; Val temp4: Seq [ए] = temp3.asInstanceOf [सेक [ए]] (); & LT; सिंथेटिक & gt; वैल temp5: कुछ [सेक [ए]] = संग्रह। इस। सेक। अनप्ली सिच [ए] (टेम्प् 4); // ...} दोनों ही मामलों में, यह देखने के लिए एक प्रकार का परीक्षण होता है कि ऑब्जेक्ट प्रकार Seq ( Seq [Int] और सीक [ए] )। प्रकार के मापदंडों को मिटाए जाने के चरण के दौरान समाप्त कर दिया जाएगा। इस प्रकार चेतावनी हालांकि दूसरा अप्रत्याशित हो सकता है, ऐसा लगता है कि इस प्रकार की जांच करने के बाद से वस्तु का पता नहीं चल पाया है क्योंकि ऑब्जेक्ट प्रकार Seq नहीं है और यह खंड मेल नहीं खाएगा और जेवीएम अगले खंड में जा सकता है यदि प्रकार से मेल खाता है, तो वस्तु को Seq पर लगाया जा सकता है और अनुपयुक्त एसईसी को कॉल किया जा सकता है।
RE: टाइप चेक हो सकता है कि हम अलग चीजों के बारे में बात कर रहे हैं। मैं केवल यह कह रहा था कि:
(ओ: ऑब्जेक्ट) मैच {केस सेक् (आई) = & gt; Println ("seq" + i) केस ऐरे (i) = & gt; Println ("array" + i)} कुछ की तरह अनुवादित होता है:
यदि (o.isInstanceOf [Seq [_]]) {// प्रकार की जाँच करें val temp1 = o.asInstanceOf [Seq [_]] // डाली // सत्यापित करें कि temp1 लंबाई 1 और println ("seq" + temp1 (0)) और यदि है (o.isInstanceOf [आरे [_] ]) {// प्रकार चेक वैल temp1 = o.asInstanceOf [Array [_]] // डाली // सत्यापित करें कि temp1 लंबाई 1 और println ("सरणी" + temp1 (0))} टाइप चेक का उपयोग किया जाता है ताकि जब कलाकार किया जाए, तो कोई क्लास कास्ट अपवाद नहीं होता है।
क्या चेतावनी गैर चर प्रकार तर्क A में प्रकार पैटर्न Seq [A] अनियंत्रित है क्योंकि यह विर्यास से समाप्त हो जाता है उचित है और क्या ऐसे मामलों होंगे जहां क्लास कास्ट अपवाद यहां तक कि टाइप चेक के साथ, मुझे नहीं पता। संपादित करें: यहां एक उदाहरण है:
वस्तु SeqSumIs10 {def unapply (seq: seq [int]) = अगर (seq.sum == 10) कुछ (seq) और कोई नहीं} (सीक ("ए"): ऑब्जेक्ट) मैच {केस सेक्शुइम्स 10 (सीईसी) = & gt; Println ("seq.sum 10" + seq है)} // क्लासिक्स्ट अपवाद: java.lang.String java.lang.Integer के लिए नहीं डाला जा सकता है
Comments
Post a Comment