2011-07-19 18 views
5

के साथ स्कैला प्रतिबिंब मैंने यह जांचने के लिए निम्न फ़ंक्शन लिखा है कि दिया गया सिंगलटन क्लास एक विशेषता लागू करता है या नहीं।पैरामीटर प्रकार

/** Given a singleton class, returns singleton object if cls implements T.             
* Else returns None. */ 
def maybeMakeSingletonObj[T: ClassManifest](cls: Class[_]): Option[T] = { 
    try { 
    val m = classManifest[T] 
    val obj = cls.getField("MODULE$").get(m.erasure).asInstanceOf[AnyRef] 

    if (Manifest.singleType(obj) <:< m) Some(obj.asInstanceOf[T]) 
    else None 
    } catch { 
    case e: Exception => None 
    } 
} 

इस कोड को निम्न उदाहरण पर ठीक काम करता है:

trait A 
object B extends A 

assert(maybeMakeSingletonObj[A](B.getClass()) === Some(B)) 

हालांकि, निम्न उदाहरण पर विफल रहता है:

trait A[T, R] 
object B extends A[Int, Int] 

assert(maybeMakeSingletonObj[A[_,_]](B.getClass()) === Some(B)) 

कोई भी विचार? "टाइप-संबंध ऑपरेटरों <: < और =:। = केवल अनुमानों विचार किया जाना चाहिए, के रूप में वहाँ जो अभी तक पर्याप्त रूप से प्रकट होता है में प्रतिनिधित्व नहीं कर रहे हैं प्रकार अनुरूपता के कई पहलू हैं"

+0

यदि आप विफलता का वर्णन करेंगे, या कम से कम स्वयं निहित कोड शामिल करेंगे तो इससे मदद मिलेगी। –

+0

कोड स्वयं निहित है। असफलता यह है कि शायद मैकसिंगलेटन ओबीजे दूसरे मामले में कुछ (बी) वापस नहीं लौटा रहा है - यह कोई नहीं लौटा रहा है। मैनिफेस्ट चेक काम नहीं कर रहा है क्योंकि यह पहले मामले में करता है। साथ ही, यह लौट रहा है कोई भी अपवाद की वजह से नहीं, बल्कि मैनिफेस्ट चेक के कारण। –

+0

मुझे आश्चर्य है कि यह मिटाने के कारण है? मेरी समझ यह है कि पैरामीटर को संकलन से बचने के लिए नहीं माना जाता है - यानी उन्हें प्रतिबिंब के साथ देखना संभव नहीं है। यद्यपि गलत हो सकता है। – Owen

उत्तर

3
ScalaDoc से

जाहिर है, यह एक ऐसा मामला है।

संबंधित मुद्दे