2011-10-10 14 views
7

स्काला में डबल परिशुद्धता संख्या के 2 निरूपण कर रहे हैं, एक एक AnyVal, अन्य AnyRef है। JVM पर वे क्रमशः double और कक्षा java.lang.Double पर मैप किए गए हैं।मैं शुद्ध स्कैला में बॉक्स किए गए डबल का प्रतिनिधित्व कैसे करूं?

अब क्या JVM के अलावा अन्य प्लेटफार्मों पर क्या होता है? मैं आदिम के लिए Scala.Double का उपयोग कर सकता हूं, लेकिन मैं कैसे निर्दिष्ट करूं कि मुझे java.lang.Double निर्दिष्ट किए बिना बॉक्स किए गए डबल का संदर्भ चाहिए?


[संदर्भ - थॉमसज़ के उत्तर को समझने के लिए छोड़ दिया गया, लेकिन मौलिक मुद्दा नहीं।

class MyPanel(id: String) extends Panel(id) { 
    @SpringBean(name="rxAlarmLimitDb") var alarmLimitDb: Double = _ 

अगर मैं के रूप में ऊपर scala.Double के रूप में प्रकार निर्दिष्ट, इंजेक्टर, विफल रहता है, क्योंकि यह केवल वस्तुओं इंजेक्षन कर सकते हैं:

मैं एक डबल है कि मैं एक विकेट घटक में वसंत के साथ इंजेक्षन करना चाहते हैं।

अगर मैं java.lang.Double क्षेत्र के प्रकार के रूप में निर्दिष्ट करते हैं, सब कुछ ठीक है

class MyPanel(id: String) extends Panel(id) { 
    @SpringBean(name="rxAlarmLimitDb") var alarmLimitDb: java.lang.Double = _ 

लेकिन मैं जावा एपीआई पर वापस गिरने पर मेरे डिपेंडेंस कम करने के लिए कोशिश कर रहा हूँ, तो मैं कैसे बॉक्सिंग Double का प्रतिनिधित्व करते हैं इसके बिना? ]

+1

मेरा अनुमान है java.lang को देखने के लिए नहीं करना होगा कि बॉक्स्ड डबल * है * 'java.lang.Double' - जैसे स्कैला कई अन्य चीजों के लिए जावा क्लासेस का उपयोग करता है (AnyRef = java.lang.Object, स्ट्रिंग = java.lang.String)। हालांकि, मैं निश्चित रूप से नहीं जानता। – Owen

+0

@ ओवेन आप सही हैं। –

+2

वे कथन JVM पर सत्य हैं। सीएलआर पर अलग-अलग मैपिंग हैं, और मैं जानना चाहता हूं कि बॉक्सिंग डबल का प्रतिनिधित्व कैसे करें। –

उत्तर

0

क्यों प्रकार scala.Double की एक सेम बनाने नहीं? भयानक लेकिन लगता है जैसे कि यह काम कर रहा है:

<bean id="rxAlarmLimitDb" class="scala.Double" factory-method="unbox"> 
    <constructor-arg> 
     <bean class="java.lang.Double"> 
      <constructor-arg value="4.2"/> 
     </bean> 
    </constructor-arg> 
</bean> 
+0

मुझे लगता है कि मेरी समस्या जावा के साथ हल हो गई है। लैंग। डबल - लेकिन मैं उत्सुक हूँ! –

9

scala.Double == double जावा में। जब आप scala.Double बॉक्स करते हैं, तो यह java.lang.Double बन जाता है।

scala> val f = 45d; 
f: Double = 45.0 

scala> println("f=" + f.getClass) 
f=double 

scala> def foo(d: Any) = println("d=" + d.getClass) 
foo: (d: Any)Unit 

scala> foo(f) 
d=class java.lang.Double 

scala.Double प्रकार का ऑब्जेक्ट बनाने का कोई तरीका नहीं है। यह सिर्फ डबल के लिए एक उपनाम है। तो आपकी समस्या के लिए, आपको java.lang.Double का उपयोग करने की आवश्यकता है, या इसे अपने आप में संलग्न करें और निहित रूपांतरण प्रदान करें। अगर आप इसके बारे में सोचते

इस परिभाषा समझ में आता है। जावा & स्कैला कोड के बीच सभी इंटरैक्शन जो & अनबॉक्सिंग की आवश्यकता है, अपेक्षित कार्य करेगा।

यदि यह एक फर्क नहीं पड़ता, आप हमेशा कर सकते हैं:

type BoxedDouble = java.lang.Double 

तो आप :-)

+2

ये सभी कथन JVM पर सत्य हैं, लेकिन स्कैला अन्य वातावरण को लक्षित करता है। –

+0

मेरे पीओवी से एक प्रकार उपनाम बनाने के बारे में अंतिम खंड @ DuncanMcGregor की समस्या हल करता है। – vadipp