2011-06-04 17 views
9

मैं स्कैला के लिए नया हूं और वर्तमान में जावा और स्कैला मॉड्यूल दोनों वाली परियोजना पर काम करता हूं। अब मैं बाइट [] के पैरामीटर का उपयोग कर जावा से स्कैला विधि को कॉल करना चाहता हूं।मैं जावा बाइट सरणी को स्कैला बाइट सरणी में कैसे परिवर्तित करूं?

स्काला विधि हस्ताक्षर हैं: def foo(data: Array[Byte])

जावा कॉल इस तरह दिखता है: foo(x), x प्रकार byte[] है। एक अतिरिक्त बाधा यह स्काला प्रक्रिया में परिवर्तन करना प्राथमिकता नहीं दी जाती रूप

The method foo(Array) in the type Bar is not applicable for the arguments (byte[]) 

:

आईडीई मुझे इसकी संभव नहीं बताता है। जावा पक्ष पर मैंने Byte[] का उपयोग करने का प्रयास किया, लेकिन इससे समस्या हल नहीं हुई। कुछ रूपांतरण मौजूद होना चाहिए?

+0

आप किस आईडीई का उपयोग कर रहे हैं? Intellij इसके साथ कोई समस्या नहीं है। – sourcedelica

+0

क्या आप 2.8 या बाद में उपयोग कर रहे हैं? 'ऐरे [बाइट]' _is_ 'बाइट []' 2.8 के रूप में, इसलिए यदि आपका आईडीई शिकायत कर रहा है तो आपका आईडीई गलत है। –

+0

मैं ग्रहण 2.0.0-बीटा 4 के लिए स्थापित स्कैला आईडीई के साथ एक्लिप्स हेलियोस 3.6.2 का उपयोग कर रहा हूं। यह परियोजना मेवेन मॉड्यूल में आयोजित की जाती है, जहां स्कैला और जावा मॉड्यूल दोनों में स्काला-लाइब्रेरी-2.9.0 मेवेन निर्भरता के रूप में शामिल है। मैंने देखा है कि स्कैला आईडीई कभी-कभी अजीब चीजें कर रही है - जैसे कि पैकेज एक्सप्लोरर में काल्पनिक चेतावनियां और त्रुटियां दिखाना, लेकिन आमतौर पर प्रोजेक्ट की सफाई और पुनर्निर्माण में मदद मिलती है (जिसे मैंने पहले ही इस मामले में करने की कोशिश की है)। – mtsz

उत्तर

4

जैसा कि अन्य ने बताया, रूपांतरण में कोई समस्या नहीं है। मेरा आईडीई गलत काम कर रहा है, और काल्पनिक त्रुटियों को दिखा रहा है जो बिना किसी समस्या के संकलित हैं।

The method receive(Array) from the type ScalaByteReceiver refers to the missing type Array

लेकिन इस कोड है, जो मेरे सवाल का एक मिसाल है, ठीक संकलित करता है तथा अपेक्षित परिणाम अर्जित करता है:

इस समय कोड निम्नलिखित में मुख्य-विधि में प्राप्त विधि के कॉल त्रुटि के साथ चिह्नित है

जावा:

package stackOverflow; 

public class JavaByteSender {  
    public static void main(String... args) { 
    new ScalaByteReceiver().receive(new byte[4]); 
    } 
} 

स्काला:

package stackOverflow 

import stackOverflow._ 

class ScalaByteReceiver{ 

    def receive(bytes: Array[Byte]) {  
    println(bytes.length); 
    // prints 4 
    } 
} 

तो जावा और स्कैला एक-दूसरे को अच्छी तरह से समझते हैं।

1

मैंने आपकी त्रुटि को पुन: उत्पन्न करने की कोशिश की लेकिन यह अपेक्षा के अनुसार भाग गया। स्केला 2.9.0 और एसबीटी

जावा कोड के साथ चल रहा है:

package stackOverflow; 

public class ByteContainer { 

    private byte[] bytes; 

    public ByteContainer(byte[] bytes){ 
     this.bytes = bytes; 
    } 

    public byte[] getBytes() { 
     return bytes; 
    } 

    public void setBytes(byte[] bytes) { 
     this.bytes = bytes; 
    } 

} 

स्केला कोड:

package stackOverflow 

import stackOverflow._ 

class ScalaByte{ 
    val bytes:Array[Byte] = "this is my test".getBytes() 
} 

object ByteUser extends App{ 
    val b = new ByteContainer((new ScalaByte()).bytes) 
    val s = b.getBytes() 
    println(s) 
} 

उत्पादन: [बी @

6ef38f6f यह संकलित करता है तथा चलाता है। क्या आप यही नहीं पूछ रहे थे? टिप्पणी करने के लिए स्वतंत्र महसूस करें।

+0

"क्या यह आप नहीं पूछ रहे थे?" - लगभग :) ...आप स्कैला 'ऐरे [बाइट]' को जावा (कन्स्ट्रक्टर) विधि से पास करते हैं जो 'बाइट []' की अपेक्षा करता है, और मैं दूसरी दिशा में समाधान की तलाश में था। लेकिन आपने सफलतापूर्वक दिखाया कि यह ठीक काम करता है। मुझे आश्वस्त है कि मेरा आईडीई गलत व्यवहार कर रहा है, वास्तव में रूपांतरण में कोई समस्या नहीं है। मैंने एक कामकाजी उदाहरण लागू किया जो मैं एक सेकंड में पोस्ट करूंगा, जो त्रुटियों के साथ चिह्नित है लेकिन संकलित करता है और अपेक्षित परिणाम उत्पन्न करता है। लेकिन आपके कोड के लिए धन्यवाद, मैंने कामकाजी उदाहरण के लिए आधार के रूप में इसका उपयोग करने की स्वतंत्रता ली। – mtsz

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