2010-01-05 10 views
15

मैं एक आंतरिक कक्षा को लागू करने की कोशिश कर रहा हूं जिसमें सामान्य पैरामीटरयुक्त प्रकार है।मैं एक आंतरिक वर्ग में पैरामीरेटेड जेनेरिक प्रकारों का उपयोग कैसे करूं?

public class AVLTree<T extends Comparable<? super T>> implements Iterable<T> { 
... 

private class BinaryNode<T extends Comparable<? super T>> { 
    ... 
} 

private class TreePreOrderIterator<E extends Comparable<? super E>> implements Iterator<E> { 
    ... 
} 

} 

यह काम नहीं करता है:

यहाँ मेरी कोड का एक लघु संस्करण है। ग्रहण/जावा मुझे चेतावनी दे रहा है कि आंतरिक वर्ग पर T पैरामीटर सुपर क्लास के पैरामीटर को 'छुपा' है। इस पर कोई विचार कैसे मैं इसे ठीक कर सकता हूं?

संपादित करें: मैंने अन्य आंतरिक वर्ग को जोड़ा है जिसमें मुझे समस्याएं हैं: TreePreOrderIterator। सामान्य प्रकार TAVLTree, BinaryNode, और TreePreOrderIterator के लिए समान होगा। आंतरिक कक्षाओं को AVLTree में फ़ील्ड तक पहुंचने की आवश्यकता है।

EDIT2: इसके अलावा, IteratorBinaryNode<T> तक पहुंचता है, जो एक संघर्ष है।

(नोट:। यह मैं एक वर्ग के लिए कर रहा हूँ बड़ा परियोजना का हिस्सा है किसी भी अन्य जानकारी की जरूरत है, के लिए कहें।)

+0

क्या आप अपना प्रश्न संपादित कर सकते हैं कि सामान्य प्रकार के बाइनरी नोड का उपयोग कैसे किया जाता है? उदाहरण के लिए, AVLTree के समान प्रकार के पैरामीटर द्वारा बाइनरीनोड पैरामीटर किया गया है? – Carl

+0

बस संपादित किया गया। क्या इससे आपके सवाल का जवाब मिलता है? –

उत्तर

28

आप BinaryNode में T चाहते हैं, enclosing TAVLTree के साथ जुड़े के रूप में एक ही प्रकार हो BinaryNode में T की घोषणा दूर करने के लिए।

आप BinaryNode में TAVLTree के साथ जुड़े enclosing T की तुलना में अलग होना चाहता हूँ, लेकिन आप माता-पिता AVLTree की गुण का उपयोग करने की, नाम बदलने और कुछ T को कुछ सक्षम होना चाहते हैं हैं।

आप enclosing AVLTree की गुण का उपयोग करने की जरूरत नहीं है, BinaryNode स्थिर हैं।

+0

ठीक है, धन्यवाद।मैंने इसे कुछ अलग कारणों में बदल दिया क्योंकि मुझे एवीएलटी में गुणों या फ़ील्ड तक पहुंचने की आवश्यकता है। समस्या यह है कि मुझे कुछ संकलन त्रुटियां मिल रही हैं जैसे कि "टाइप मिस्चैच: एवीएलटी ट्रीप्र्रे ऑर्डर इटरेटर से इटरेटर " और "बाउंड मिस्चैच:" टाइप टी बाध्य पैरामीटर के लिए एक वैध विकल्प नहीं है > प्रकार के AVLTree .TreePreOrderIterator । " कोई फिक्स? –

+0

'<ई तुलनात्मक ' का प्रयास करें। – notnoop

+1

मैंने टी (पहला विकल्प) की घोषणा को हटा दिया। अब जब मैं लिखता हूं "नया एवीएलट्री लौटाएं। ट्रीप्रो ऑर्डर इटरेटर ();" मुझे त्रुटि मिलती है "सदस्य प्रकार AVLTree.TreePreOrderIterator पैरामीटरयुक्त प्रकार के साथ योग्य होना चाहिए, क्योंकि यह स्थैतिक नहीं है।" जब मैं पिछले कोड से "" हटा देता हूं, तो मुझे चेतावनी मिलती है "AVLTree.TreePreOrderIterator एक कच्चा प्रकार है। जेनेरिक प्रकार AVLTree के संदर्भ। .TreePreOrderIterator पैरामीटरकृत होना चाहिए।" –

7

बस कुछ और तो यह के साथ संघर्ष नहीं होगा करने के लिए T नाम बदलने बाहरी वर्ग टी

प्रकार पैरामीटर नाम आंतरिक कक्षाओं सहित सभी वर्ग के दायरे में दिखाई दे रहे हैं। इसलिए आंतरिक वर्ग या उदाहरण विधियों को अभी तक एक और प्रकार पैरामीटर घोषित करना चाहिए जिसका नाम वर्ग प्रकार पैरामीटर के साथ संघर्ष करता है। हालांकि, स्थैतिक घोंसले वाले वर्गों और स्थैतिक तरीकों में उस समस्या नहीं है।

0

यह क्योंकि पैरामीटर T (BinaryNode<T> वर्ग के लिए पैरामीटर के रूप में) AVLTree<T> के लिए इस्तेमाल किया है कि के रूप में ही है है - AVLTree के लिए इस्तेमाल किया पैरामीटर भीतरी वर्ग BinaryNode की परिभाषा के लिए दायरे में सामान्य रूप से है, लेकिन क्योंकि तुम ' एक नया पैरामीटर एक ही नाम दे रहा है, यह छिपा होगा। इसके बजाय आप इस्तेमाल कर सकते हैं:

private class BinaryNode<U extends Comparable<? super T>> { ... } 
1

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

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