2012-04-06 13 views
5

मैं स्कैला के संरचनात्मक प्रकारों के साथ खेल रहा था जब मुझे पता चला कि मुझे एक बग की तरह दिखता है। यहाँ मेरी कोड है:संरचनात्मक प्रकार और प्राइमेटिव

type toD = { def toDouble: Double } 
def foo(t: toD) = t.toDouble 
foo(5) 

और मैं यह त्रुटि आई:

java.lang.NoSuchMethodException 
at scala.runtime.BoxesRunTime.toDouble(Unknown Source) 
at .foo(<console>:9) 
at .<init>(<console>:11) 
at .<clinit>(<console>) 
at .<init>(<console>:11) 
at .<clinit>(<console>) 
at $print(<console>) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704) 
at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920) 
at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43) 
at scala.tools.nsc.io.package$$anon$2.run(package.scala:25) 
at java.lang.Thread.run(Unknown Source) 

पहले, मैं क्यों यह काम नहीं कर रहा पता नहीं है। दूसरा, यह अजीब बात है कि कोड ठीक से संकलित करता है और रनटाइम पर अपवाद फेंकता है कि यह विधि वास्तव में मौजूद नहीं है।

क्या किसी के पास इसके लिए स्पष्टीकरण है?

+3

ध्यान दें कि यह उदाहरण स्काला 2.10 विकास संस्करण में काम करता है । लेकिन यह नहीं कह रहा है कि संरचनात्मक प्रकारों और बक्से वाले प्राइमेटिव के पूरे गन्दा क्षेत्र को पूरी तरह से स्वच्छ किया जाता है। – Debilski

+0

एक और गन्दा कामकाज: 'foo (5.asInstanceOf [toD])' काम करता है। – Jus12

उत्तर

6

मैंने अभी इसके साथ थोड़ा सा खेला और यह वास्तव में एक बग प्रतीत होता है। हालांकि यह काम करता है अगर तुम सिर्फ किसी भी करने के लिए वापसी प्रकार सेट जब:

type toD = { def toDouble: Any } 

मुझे लगता है कि यह स्वत: मुक्केबाजी और जिस तरह पुरातन नियंत्रित किया जाता है के साथ क्या करने के लिए कुछ हो सकता है।

संपादित करें:

मैं सिर्फ एक वैकल्पिक हल मिल गया:

type toD[A] = { def toDouble: A } 
def foo[A](x: toD[A])(implicit y: A =:= Double) = x.toDouble 

यह सुनिश्चित करता है, कि toDouble (ए) के रिटर्न मान है डबल

+1

वर्कअराउंड जोड़ा गया – drexin