2015-04-29 14 views
5

जावा 1.6 के स्थान पर विस्तारित कक्षा का उपयोग करें। मैंने कुछ तरीकों को शामिल करने के लिए एक कक्षा बढ़ा दी है। अब मैं बेस क्लास के स्थान पर विस्तारित कक्षा का उपयोग करना चाहता हूं। हालांकि, कक्षा वर्ग का उपयोग करने वाले वर्ग विस्तारित वर्ग को "पहचान" नहीं सकते हैं। (अनुशंसित) तय क्या है?बेस क्लास

मुझे पता है कि यह विभिन्न स्वादों में कई बार पूछा गया है, लेकिन मुझे यह नहीं मिल रहा है!

उदाहरण वर्ग SAMRecord बढ़ाएँ और SAMRecordExt समापन का उपयोग करें:

public class SAMRecordExt extends SAMRecord{ 

    public SAMRecordExt(SAMFileHeader header) { 
     super(header); 
    }  

} 

अब, जबकि इस काम करता है:

SAMRecord rec= sam.iterator().next(); 

यह मैं

SAMRecordExt recext= sam.iterator().next(); 
>>> Type mismatch: cannot convert from SAMRecord to SAMRecordExt 

हैरानगी एक संकलन त्रुटि देता है, इस या तो काम नहीं करता (रनटाइम त्रुटि):

SAMRecordExt recext= (SAMRecordExt) sam.iterator().next(); 
>>> Exception in thread "main" java.lang.ClassCastException: htsjdk.samtools.SAMRecord cannot be cast to markDupsByStartEnd.SAMRecordExt 
at markDupsByStartEnd.Main.main(Main.java:96) 

मैं विस्तारित वर्ग का काम कैसे कर सकता हूं जहां बेस क्लास काम करता है?

संपादित करें: कक्षाओं के बारे में अधिक जानकारी मैं उपयोग कर रहा हूं। sam वस्तु आता

SamReaderFactory sf = SamReaderFactory.makeDefault(); 
SamReader sam= sf.open(new File(insam)); 

सभी दस्तावेज़ से https://samtools.github.io/htsjdk/javadoc/htsjdk/index.html

+0

कर सकते हैं आप उपरोक्त कोड –

+0

में परिवर्तनीय "सैम" की घोषणा प्रदान करते हैं ऐसा लगता है कि उस वर्ग का उपयोग सुपर क्लास के साथ किया जाना था, जिसका अर्थ है: लेखक सुपर क्लास के बारे में जानता था, और उसमें प्रदान की गई कार्यक्षमता की आवश्यकता होती है। अब, समस्या यह है कि, जब आप उस कलाकार को करने का प्रयास करते हैं: बाल वर्ग का हर उदाहरण सुपर क्लास का एक उदाहरण है, लेकिन सुपर क्लास का हर उदाहरण बाल वर्ग का उदाहरण नहीं है। – Stultuske

+0

ऐसा लगता है कि आप उस कोड को नहीं चला रहे हैं जो आपको लगता है कि आप चल रहे हैं, या आप पोस्ट किए गए कोड को संकलित नहीं कर रहे हैं। आपके द्वारा पोस्ट किए गए कोड के अनुसार आपको 'SAMRecordExt को SAMRecord' तक प्रदान की गई कोई भी संकलन त्रुटियां नहीं मिलनी चाहिए। – EJP

उत्तर

3

समस्या है:

sam.iterator().next() 

रिटर्न एक SAMRecord वस्तु

इसका मतलब है

SAMRecordExt recext= sam.iterator().next(); 

काम नहीं करेगा क्योंकि एक सुपर क्लास एक उप वर्ग चर को असाइन नहीं किया जा सकता है।

सामान्य समस्या यह है कि सबक्लास सुपर क्लास से अधिक विशिष्ट है, इसलिए आप उप क्लास चर पर एक सुपर क्लास ऑब्जेक्ट असाइन नहीं कर सकते हैं क्योंकि सुपर क्लास को उन चीज़ों को नहीं पता जो उप वर्ग की आवश्यकता है जानना।

दूसरी तरफ सबक्लास सुपर क्लास के विवरण और कुछ और विवरणों को जानता है जिसका अर्थ है कि आप एक सुपर क्लास वेरिएबल को उप-वर्ग ऑब्जेक्ट असाइन करने में सक्षम हैं। समस्या के लिए

समाधान:(संपादित)

आम तौर पर आप वर्ग का विस्तार करने और इटरेटर विधि ओवरराइड और प्रकार आप चाहते हैं की एक अच्छी तरह से निर्माण किया इटरेटर वापस जाने के लिए सक्षम हैं।

लेकिन समस्या मैं यहाँ देख सकते हैं कि कारखाने प्रकार SamReader के अपने obj जो आप SamRecords

अतः से अधिक पुनरावृति करने के लिए उपयोग बनाता है -> आप कारखाने SamReader और अन्य प्रकार के वापस जाने के लिए फैली चाहिए पुनरावृति बाद में पर अपने कामना रिकॉर्ड प्रकारों फैक्टरी वर्ग के

स्रोत कोड देखें:

https://github.com/samtools/htsjdk/blob/master/src/java/htsjdk/samtools/SamReaderFactory.java

+0

HI- जब आप कहते हैं "चर के लिए SAMRecord प्रकार का उपयोग करें", क्या यह वर्ग को विस्तारित करने का बिंदु नहीं खोता है? – dariober

+0

हां मैं इटरेटर विधि – Zelldon

+0

धन्यवाद को ओवरराइड करना पसंद करूंगा! "उप वर्ग में पुनरावर्तक विधि को ओवरराइड करें" किसी भी मौके पर आप कोड का सारांश बदलने के लिए पोस्ट कर सकते हैं? – dariober