2013-10-29 15 views
5

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

case class NonValueClass(underlying: Int) 
:

def isObjectOfValueClass(arg: Any) = 
    classOf[AnyVal].isAssignableFrom(arg.getClass) 

इस उम्मीद के रूप में विधि के लिए रिटर्न true काम नहीं करता है,

isObjectOfValueClass कैसे लागू किया जा सकता है? या क्या ऐसी पद्धति को प्रतिबिंबित करने का एक आसान तरीका है जो मूल्य वर्ग की वस्तु को तर्क के रूप में ले सकता है?

+1

वैसे, मूल्य वर्ग न केवल प्राइमेटिव्स बल्कि वस्तुओं को भी लपेट सकता है। –

उत्तर

3

सबसे पहले, ध्यान दें कि आपके isObjectOfValueClass आपके मूल्य वर्ग के उदाहरणों का एक बॉक्स संस्करण होगा।

दूसरा, यह आपके जैसा काम नहीं कर सकता है। ऐसा इसलिए है क्योंकि classOf[AnyVal] == classOf[AnyRef] == <java.lang.Object>

कोई क्रम जिस तरह से एक बॉक्स्ड मूल्य वर्ग और एक संदर्भ वर्ग (Any के बीच अंतर करना .instanceOf[T], AnyVal पैटर्न मिलान में या .instanceOf[T] के पैरामीटर के रूप में नहीं किया जा सकता नहीं है नहीं है, और क्या सबसे महत्वपूर्ण है, संकलित मूल्य कक्षाएं नहीं है AnyVal का विस्तार या कार्यान्वयन)।

यदि आप चाहते हैं यह संकलन समय पर फैसला किया है, तो कोशिश:

case class IsAnyVal[-T](val value: Boolean) extends AnyVal 
implicit def _noClueHowToNameThisImplicit_1 = IsAnyVal[AnyVal](true) 
implicit def _noClueHowToNameThisImplicit_2 = IsAnyVal[AnyRef](false) 
def isAnyVal[T](arg: T)(implicit ev: IsAnyVal[T]) = ev.value 

scala> isAnyVal(1) 
res4: Boolean = true 

scala> isAnyVal("") 
res5: Boolean = false 

मुझे यकीन है कि कैसे आप और अधिक आकस्मिक मुक्केबाजी के बिना पता लगाया बॉक्सिंग मूल्य वर्ग उदाहरणों के एकमात्र क्षेत्र निकालना चाहते हैं नहीं कर रहा हूँ। इसके अलावा, हॉटस्पॉट छोटे अल्पकालिक वस्तुओं को अनुकूलित करने में बहुत अच्छा है।

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