2012-12-20 19 views
5

मैं अपने उच्च श्रेणी में निम्नलिखित है एक आकर्षण की तरह काम:जावा उपवर्ग के नए सिरे से परिभाषित विधि में शीर्ष वर्ग संपत्ति उपयोग नहीं कर सकते

public class TestA<E extends Test> 
{ 
     List<Vector<E>> list; 
     String name, location; 

     TestA(String name, String location) 
     { 
      this.name = name; 
      this.location = location; 
      list = new ArrayList<Vector<E>>(); 
     } 

     void populate(Test[] arr) 
     { 
      for(Vector<E> vk : list) 
      { 
        // Code here... 
      } 
     } 

}  

class OrderedTest<E extends Test> extends TestA { 

     OrderedTest(String name, String location) 
     { 
      super(name, location); 
     } 

     void populate(Test[] arr) 
     { 
      for(Vector<E> vk : list) // ERROR: Cannot convert from element Object to Vector<E> 
      { 
        // Code here... 
      } 
     } 

} 

जब मैं अपने उपवर्ग में भरें() का विस्तार करने की कोशिश मैं मूल रूप से एक ही विधि चाहते हैं केवल यहां मैं चीजों को आदेश देना चाहता हूं इसलिए मैं प्रत्येक वेक्टर को एक त्वरित विधि में खींच दूंगा लेकिन मुझे कोई अन्य समस्याएं नहीं मिलती हैं: // ERROR: Cannot convert from element Object to

संपादित करें: क्या मुझे टेस्टा के लिए इटरेटर लागू करना होगा?

+1

आप 'वेक्टर' का उपयोग क्यों कर रहे हैं? –

+0

मैं एल्गोरिदम और डेटा संरचनाओं पर एक पुस्तक पढ़ रहा हूं और जो मैंने पढ़ा है उसके साथ प्रयोग कर रहा हूं। मैं समझता हूं वेक्टर पुराने और डीपी हैं। –

उत्तर

9

कोडेड के रूप में, जेनेरिक पैरामीटर के रूप में "ई" के दो उपयोग स्वतंत्र और डिस्कनेक्ट होते हैं। एक वर्ग में Vector<E> का मतलब दूसरे में Vector<E> जैसा नहीं है।

बदलें उपवर्ग घोषणा करने के लिए:

class OrderedTest<E extends Test> extends TestA<E> 

और सुपर क्लास घोषणाओं में ई OrderedTest में के रूप में ही ई है।

+0

मुझे अब बेवकूफ महसूस नहीं है:)। बहुत बहुत धन्यवाद। –

1

आप एक जेनेरिक

class TestA<E> 

प्रकार सूची का एक क्षेत्र < वेक्टर को परिभाषित करने की घोषणा की < ई>>, इसका मतलब है कि वेक्टर प्रकार ई के तत्वों, यह भी मतलब है कि कि अगर आप ई परिभाषित नहीं करते में शामिल होंगे , जब टेस्टा वेक्टर के उपclassing का त्वरण वेक्टर होगा।

class OrderedTest<E extends Test> extends TestA 

को परिभाषित करने के लिए इस सामान्य पत्र 'ई' पुन: उपयोग पिता वर्ग के लिए यह बाँध नहीं करता है:

बच्चे को भी कक्षा एक सामान्य रूप में परिभाषित किया गया है। उस ने कहा कि आपने पिता वर्ग ई प्रकार को परिभाषित नहीं किया है, और यह ऑब्जेक्ट (डिफ़ॉल्ट प्रकार) क्यों है।

आप बच्चे वर्ग के रूप में एक ही के रूप में आप यह परिभाषित करना होगा होने के लिए पिता वर्ग सामान्य प्रकार को परिभाषित करना चाहते हैं:

को
class OrderedTest<E extends Test> extends TestA<E> 

टिप्पणी पत्र 'ई' यहां कोई भी नहीं है कि पिता 'ई' पैरामीटर के साथ कनेक्शन, और यह कोई पत्र हो सकता है क्योंकि यह कक्षा ऑर्डर्डटेस्ट के लिए पैरामीटर कहां है, आपने अभी इस प्रकार पैरामीटर का उपयोग करने के लिए पिता प्रकार पैरामीटर को परिभाषित करने का निर्णय लिया है। तो अगर आप उदाहरण के लिए कर सकते हैं:

class OrderedTest<T extends Test> extends TestA<T> 

महत्वपूर्ण बात यह है कि एक बच्चे को परिभाषित किया जाएगा साथ पिता वर्ग प्रकार संपत्ति को परिभाषित करने के लिए है, ताकि आप एक ही डेटा प्रकार की उम्मीद कर सूची क्षेत्र पहुँच सकते हैं।