2013-03-13 11 views
7

मैं rjava पैकेज के साथ खेल रहा हूं, लेकिन ऐसा लगता है कि आरजेवा जावा जेनेरिक प्रकारों से अवगत नहीं है, मुझे जेनेरिक टाइप पैरामीटर के साथ जावा ऑब्जेक्ट बनाने में कठिनाइयां हैं। अगर मैं की तरह एक जावा वर्ग है:rJava जेनेरिक प्रकार

public class A<T> { 
    private B<T> b; 
    public A(B<T> b) { 
     this.b = b; 
    } 
} 

मैं पहले से ही बनाया (instantiated प्रकार पैरामीटर के साथ) एक बी वस्तु पारित करके .jnew() का उपयोग कर अनुसंधान सत्र से एक एक वस्तु बनाने के लिए चाहते हैं, लेकिन rJava हमेशा त्रुटि देता है:

java.lang.NoSuchMethodError: <init> 

क्या इसके लिए कोई काम है?

+0

जब आप '.jnew()' कॉल करते हैं तो आप किस सटीक वाक्यविन्यास का उपयोग कर रहे हैं? क्या आप इसे तर्क दे रहे हैं?कृपया उन्हें बिल्कुल निर्दिष्ट करें। – Brick

+0

यहां एक काम किया उदाहरण है। आपको [यहां] (http://www.phil.cmu.edu/projects/tetrad_download/download/tetrad-5.2.1-3.jar) (1 9 एमबी) और नमूना डेटासेट से टेट्रैड जार डाउनलोड करने की आवश्यकता होगी, charity.txt, [यहां] से (http://www.phil.cmu.edu/projects/tetrad_download/download/workshop/Data/charity.txt)। आर में सेट करें: 'setwd ("कहीं भी/आप/put/the/data /") ' ' लाइब्रेरी (आरजेवा)', '.jinit (" पथ/से/tetrad-5.2.1-3.jar ")'। निम्नलिखित सभी कार्य: 1. 'filename = .jnew (" जावा/लैंग/स्ट्रिंग "," charity.txt ")', 2. 'datafile = .jnew (" जावा/io/फ़ाइल ", फ़ाइल नाम)', 3. 'पाठक = .jnew (" edu/cmu/tetrad/data/dataReader ")', –

+0

4. 'delim = J (" edu/cmu/tetrad/data/DelimiterType ")', 5. पाठक $ setDelimiter ($ TAB delim '', 6.' डेटासेट = पाठक $ parseTabular (datafile) '। लेकिन निम्नलिखित काम नहीं करता है: 7. 'gesinstance = .jnew ("edu/cmu/tetrad/search/ges", डेटासेट) '। पाठक $ parseTabular डेटासेट देता है, और जीएस क्लास डेटासेट तर्क के साथ बनाया जाना चाहिए। दुर्भाग्य से यह काम नहीं करता है। मुझे लगता है कि कारण यह है क्योंकि जीस दो इंटरफेस, ग्राफशर्च और ग्राफ़स्कोरर लागू करता है, और ग्राफ़स्कोरर केवल एक डबल है। जावा स्रोत में: 'सार्वजनिक इंटरफ़ेस GraphScorer { डबल स्कोरडाग (ग्राफ़ डैग); } ' –

उत्तर

1

इस प्रश्न में बहुत सारे चल रहे हिस्सों हैं। विभिन्न भागों के लिए प्रलेखन के माध्यम से खुदाई, मुझे लगता है कि आप लाइन है कि तोड़ दिया पर ऐसा करने की जरूरत:

gesinstance = .jnew("edu/cmu/tetrad/search/Ges", .jcast(dataset, "edu/cmu/tetrad/data/DataSet")) 

मुख्य अंतर यह दूसरा तर्क पर .jcast करने के लिए कॉल किया जा रहा है। (मेरे पास आर इंस्टॉल नहीं है, इसलिए मैं इसका परीक्षण नहीं कर सका - अगर यह काम नहीं करता है, तो मैं अपने त्रुटि को नए त्रुटि संदेशों पर प्रदान की जा सकने वाली किसी भी प्रतिक्रिया के आधार पर अपडेट कर दूंगा।)

तो सवाल यह है कि "यह क्यों?" इस सवाल का जवाब हो रहा है:

  1. जावा तरफ, DataReader.parseTabularData प्रकार DataSet के साथ एक वस्तु के रूप में आप का उल्लेख किया दिखाए, लेकिन DataSet एक इंटरफेस नहीं एक वर्ग है। इसका जरूरी अर्थ यह है कि वास्तविक वस्तु लौटाई गई कुछ कक्षा है जो DataSet इंटरफ़ेस लागू करती है।
  2. उन कारणों के लिए जो मुझे तुरंत स्पष्ट नहीं हैं, आरजेएवी पैकेज वास्तव में पॉलिमॉर्फिज्म को अच्छी तरह से संभाल नहीं करता है। यह आवश्यक है कि आप उन वस्तुओं को "सटीक" हस्ताक्षर मिलान के साथ विधियों को कॉल करें जिन्हें आप पास कर रहे हैं। इस मामले में, आपको इंटरफेस DataSet पर जो भी विशिष्ट वर्ग मिला है, उससे आपको "अप-कास्ट" करने की आवश्यकता होगी। .jnew (https://www.rforge.net/doc/packages/rJava/html/jnew.html) के लिए प्रलेखन देखें, खासकर उन तर्कों के लिए जिन्हें वे "..." द्वारा दर्शाते हैं। यह आपको .jcall (https://www.rforge.net/doc/packages/rJava/html/jcall.html) के लिए प्रलेखन के संबंधित भाग को संदर्भित करता है, फिर कुछ उदाहरणों के साथ .jcast (https://www.rforge.net/doc/packages/rJava/html/jcast.html) पर कॉल करने की आवश्यकता बताता है।

आपको मिली त्रुटि जो आपको मिली है java.lang.NoSuchMethodError: <init> आपको बता रहा था कि JVM आपके द्वारा बुलाए गए निर्माता को नहीं ढूंढ सका। उदाहरण के लिए यह रहस्यमय दिख रहा था कि आपने टिप्पणियों में पोस्ट किया था। (वैसे भी, अपने प्रश्न को संपादित करना अच्छा हो सकता है, और उस जानकारी को पोस्टरिटी के लिए वहां शामिल कर सकते हैं।) कोड निश्चित रूप से सही दिखता है, और, जावा को जानकर, मैंने सहजता से जावा के बहुरूपता का सम्मान करने के लिए इंटरफ़ेस की अपेक्षा की। यह देखते हुए कि (जो भी कारण है), इंटरफ़ेस आर के लिए विरासत पर विचार किए बिना "सटीक" प्रकार मिलान करता है, यह स्पष्ट है कि इसे उपरोक्त कारण # 1 के कारण कोई कन्स्ट्रक्टर नहीं मिलेगा।

अंततः, मुझे वास्तव में टेट्रैड की सीमित खोज में जेनरिक का उपयोग करके किसी भी जावा कक्षा का सामना नहीं करना पड़ा। जैसा कि यह पता चला है, हालांकि यह एक पूर्ण लाल हेरिंग था। अगर भविष्य में यह एक मुद्दा हो, तो आप शायद "टाइप एरर" (https://docs.oracle.com/javase/tutorial/java/generics/erasure.html) देखना चाहेंगे। यदि आप जावा और सी, सी ++, फोरट्रान के बीच इंटरफेसिंग कर रहे थे, तो जावा किसी भी भाषा को "देशी" मानती है, तो आप टाइप-मिस्ड फॉर्मों में काम करके मूल कोड में जेनेरिक से निपटेंगे। हालांकि, आरजेएवी इंटरफ़ेस अलग-अलग हो सकता है, क्योंकि ऐसा लगता है कि यह सामान्य प्रकार की संरचना में पड़ता है जो आपको आपकी वर्तमान समस्या पर ले जाता है। (शायद बाद में अपने बक्षीस के योग्य!)

+0

धन्यवाद !! यह उस समस्या को हल करता है जिसका सामना मैं कर रहा था, और मुझे राजवा (और जावा स्वयं) की बेहतर समझ देता है। मुझे यकीन नहीं है कि सवाल को कैसे संपादित किया जाए, क्योंकि मैंने मूल प्रश्न नहीं पूछा था, और आपने पाया है कि यह मेरे सामने आने वाली पूरी तरह से अलग समस्या है। शायद मुझे इसे दो भाग का सवाल बनाना चाहिए? –

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