2009-10-14 12 views
14

मैं इन स्केला दुभाषिया के लिए टाइप करें:इंट बनाम पूर्णांक: प्रकार मेल नहीं खाता, पाया: इंट, आवश्यक: स्ट्रिंग

val a : Integer = 1; 
val b : Integer = a + 1; 

और मैं संदेश मिलता है:

<console>:5: error: type mismatch; 
found : Int(1) 
required: String 
     val b : Integer = a +1 
          ^

क्यों? इसे कैसे हल किया जा सकता है? इस बार मुझे जावा इंटरऑपरेबिलिटी कारणों के कारण इंटीजर की आवश्यकता है।

उत्तर

19

यह सवाल लगभग का डुप्लिकेट है: Scala can't multiply java Doubles? - आप के रूप में अच्छी my answer देख सकते हैं, के रूप में विचार समान है। Eastsun पहले से ही संकेत दिया

के रूप में, इस सवाल का जवाब एक java.lang.Integer से एक अंतर्निहित रूपांतरण (मूल रूप से एक बॉक्सिंग int आदिम) एक scala.Int है, जो JVM आदिम पूर्णांकों का प्रतिनिधित्व करने के स्काला तरीका है।

implicit def javaToScalaInt(d: java.lang.Integer) = d.intValue 

और इंटरऑपरेबिलिटी हासिल की गई है - आपके द्वारा दिए गए कोड को ठीक से संकलित करना चाहिए! और कोड जो scala.Int का उपयोग करता है जहां java.lang.Integer की आवश्यकता है ऑटोबॉक्सिंग के कारण ठीक काम करने लगता है। तो निम्न कार्य: - जो वास्तव में scala.Predef.Integer के लिए आशुलिपि है के रूप में यह अब मान्य नहीं है और सबसे शायद स्काला 2.8 में हटाया जा रहा है

def foo(d: java.lang.Integer) = println(d) 
val z: scala.Int = 1 
foo(z) 

इसके अलावा, जैसा michaelkebe कहा, Integer प्रकार का उपयोग नहीं करते।

संपादित करें: ओह ... क्यों जवाब देना भूल गया। आपको जो त्रुटि मिलती है वह शायद scala.Predef.Integer ने जावा की सिंटैक्टिक चीनी की नकल करने की कोशिश की जहां a + "my String" का अर्थ है स्ट्रिंग कॉन्सटेनेशन, aint है। इसलिए + विधि scala.Predef.Integer प्रकार में केवल स्ट्रिंग कॉन्सटेनेशन (String प्रकार की अपेक्षा) और कोई प्राकृतिक पूर्णांक अतिरिक्त नहीं है।

- फ्लवियू सिपसिगन

0

सबसे पहले आपको Integer के बजाय java.lang.Integer का उपयोग करना चाहिए।

वर्तमान में मुझे नहीं पता कि त्रुटि क्यों होती है।

ajava.lang.Integer का एक उदाहरण है और इस प्रकार एक विधि + नामित नहीं है। इसके अलावा Int पर कोई अंतर्निहित रूपांतरण नहीं है।

इस हल करने के लिए आप इस कोशिश कर सकते हैं:

 
scala> val a: java.lang.Integer = 1 
a: java.lang.Integer = 1 

scala> val b: java.lang.Integer = a.intValue + 1 
b: java.lang.Integer = 2 
2
Welcome to Scala version 2.7.3.final (Java HotSpot(TM) Client VM, Java 1.6.0_16). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> implicit def javaIntToScala(n: java.lang.Integer) = n.intValue 

javaIntToScala: (java.lang.Integer)Int 

scala> val a: java.lang.Integer = 1 

a: java.lang.Integer = 1 

scala> val b: java.lang.Integer = a + 1 

b: java.lang.Integer = 2 
संबंधित मुद्दे