2011-09-22 19 views
9

मैं जावा क्लास [_] पर स्कैला पैटर्न मिलान का उपयोग करने की कोशिश कर रहा हूं (स्कैला से जावा प्रतिबिंब का उपयोग करने के संदर्भ में) लेकिन मुझे कुछ अनपेक्षित त्रुटि मिल रही है। क्यों यह हो रहा है निम्नलिखित मामले jLongवर्ग [_] प्रकार पर पैटर्न मिलान?

def foo[T](paramType: Class[_]): Unit = { 
    val jInteger = classOf[java.lang.Integer] 
    val jLong = classOf[java.lang.Long] 
    paramType match { 
    case jInteger => println("int") 
    case jLong => println("long") 
    } 
} 

किसी भी विचारों के साथ लाइन पर "पहुँच योग्य नहीं कोड" देता है?

उत्तर

15

कोड काम करता है अगर आप अपर केस को चर नाम बदलने (या उन्हें पैटर्न में बैकटिक साथ चारों ओर) के रूप में उम्मीद:

scala> def foo[T](paramType: Class[_]): Unit = { 
    | val jInteger = classOf[java.lang.Integer] 
    | val jLong = classOf[java.lang.Long] 
    | paramType match { 
    |  case `jInteger` => println("int") 
    |  case `jLong` => println("long") 
    | } 
    | } 
foo: [T](paramType: Class[_])Unit 

scala> foo(classOf[java.lang.Integer]) 
int 

अपने कोड में पहले पैटर्न में jInteger एक नया variable- है यह आसपास के दायरे से jInteger नहीं है। specification से:

8.1.1 चर पैटर्न

... एक चर पैटर्न एक्स एक सरल पहचानकर्ता जो एक लोअर केस अक्षर से शुरू होता है। यह किसी भी मान से मेल खाता है, और उस मान को परिवर्तनीय नाम से जोड़ता है।

...

8.1.5 स्थिर पहचानकर्ता पैटर्न

... एक चर पैटर्न के साथ वाक्यात्मक ओवरलैप को हल करने के लिए एक स्थिर पहचानकर्ता प्रतिमान आसान एक साथ शुरू नाम नहीं हो सकता है लोअर-केस पत्र। हालांकि, बैकक्वॉट्स में ऐसे परिवर्तनीय नाम को संलग्न करना संभव है; तो इसे एक स्थिर पहचानकर्ता पैटर्न के रूप में माना जाता है।

अधिक जानकारी के लिए this question देखें।

+1

बैकटिक मेरा तुलना में एक बेहतर समाधान है :) – JaimeJorge

+0

बहुत बढ़िया! बहुत धन्यवाद, ट्रैविस। – alphageek

7

अपने पैटर्न मिलान पर, इन 2 मामलों में से प्रत्येक उम्मीद के अनुसार वर्ग प्रकार से मेल खाने के बजाय स्थान धारक नाम बनाने का प्रयास करता है।

आप प्रारंभिक चरित्र में अपर केस का उपयोग करते हैं, तो आप ठीक हो जाओगे

def foo[T](paramType: Class[_]): Unit = { 
    val JInteger = classOf[Int] 
    val JLong = classOf[Long] 
    paramType match { 
    case JInteger => println("int") 
    case JLong => println("long") 
    } 
} 

scala> foo(1.getClass) 
int 
संबंधित मुद्दे