2012-08-22 14 views
7

के लिए कक्षा संदर्भ किसी भी आंतरिक कक्षा का संदर्भ देने का कोई तरीका है?जावा आंतरिक कक्षा

मैं एक आंतरिक वर्ग के साथ संगत रिटर्न प्रकार निर्दिष्ट करना चाहता हूं उदा।

Class<OuterClass.*> some_method(); 

मुझे लगता है कि यह वाक्यविन्यास अमान्य है। क्या इसे व्यक्त करने का कोई तरीका है?

मुझे पता है कि मैं Class<? extends OuterClass> जैसे कुछ का उपयोग नहीं कर सकता क्योंकि एक आंतरिक वर्ग बाहरी वर्ग का विस्तार नहीं करता है।

<T extends OuterClass.InnerClass> Class<T> some_method() 

कि इसके अलावा, आप किसी भी भीतरी वर्ग की एक वस्तु वापस लौट कर क्या हासिल होगा:

+2

आप ऐसा क्यों करना चाहते हैं? यह किसी भी प्रकार की सुरक्षा नहीं जोड़ता है। – SLaks

+1

हां, आप एक बाहरी वर्ग को एक बाहरी वर्ग का विस्तार कर सकते हैं, है ना? – sp00m

+0

कक्षा होने के नाते यह केवल एक मामला है जहां इसे परिभाषित किया गया है। आप पैकेज में किसी प्रकार को बाध्य करने के तरीके के बारे में भी पूछ सकते हैं। – Bohemian

उत्तर

5

ठीक है, आप कम से कम विशिष्ट इनर क्लासों का उल्लेख कर सकते हैं? यह किसी ऑब्जेक्ट को वापस करने के लिए तुलनीय होगा और इस तथ्य के साथ कि आंतरिक उदाहरण बाहरी उदाहरण के साथ विशेष संबंध रखता है। हालांकि, आप शायद उस विशेष संबंध का सीधे उपयोग करने में सक्षम नहीं होंगे।

संपादित करें:

के रूप में अन्य लोगों ने बताया पहले से ही InnerClass एक सुपर वर्ग अन्य इनर क्लासों के लिए बढ़ा दी हो सकता है। यह आपको किसी भी कक्षा को वापस करने की अनुमति देगा, जो उस वर्ग को बढ़ाता है।

यदि आप एक इंटरफ़ेस का उपयोग करेंगे, तो आप केवल आंतरिक कक्षाओं तक ही सीमित नहीं हैं, क्योंकि इस प्रतिबंध के लिए आपको गैर स्थैतिक आंतरिक इंटरफेस की आवश्यकता होगी। हालांकि, आंतरिक इंटरफेस डिफ़ॉल्ट रूप से स्थिर हैं।

+0

मुझे लगता है कि स्थिर आंतरिक कक्षाएं केवल –

+1

उपलब्ध हैं @EugenMartynov नहीं, आप गैर स्थैतिक आंतरिक कक्षाओं का भी उपयोग कर सकते हैं। – Thomas

+0

+1 अच्छा बिंदु, धन्यवाद। – jldupont

0

कोई नहीं है। आप वाइल्डकार्ड के साथ संकुल संदर्भ नहीं दे सकता बस के रूप में: इस तरह घोषणाओं के लिए

Class<com.example.*> some_method(); 
Class<com.example.?> some_method(); 

उपयोग के मामलों इतना सीमित हो सकता है, यह सिर्फ यह JLS में नहीं होगा। नोट, आप या तो जेनेरिक के दायरे के बाहर ऐसे "स्थान मिलान प्रकार" का उपयोग नहीं कर सकते हैं। जैसे यदि आप यह घोषणा नहीं कर सकते:

void some_method(OuterClass.* argument); 
void some_method(com.example.* argument); 
3

मैं नहीं बल्कि एक (भीतरी) इंटरफ़ेस निर्धारित करेगा और इसके सभी आंतरिक वर्ग इसे लागू करते हैं, और उसके बाद:

Class<OuterClass.MyInterface> someMethod(); 

यह और अधिक किसी के संदर्भ में कोशिश कर रहा से सुरक्षित प्रकार होगा आंतरिक वर्ग और आपको उस दिन कोई समस्या नहीं होगी जब आपको किसी अन्य उपयोग के लिए किसी अन्य आंतरिक कक्षा की आवश्यकता होती है, या जिस दिन आप कक्षा निकालने का निर्णय लेते हैं।

+0

+1 अच्छा विकल्प, धन्यवाद! – jldupont

+0

दुर्भाग्यवश, आंतरिक इंटरफेस समर्थित नहीं हैं। यह एक आंतरिक आधार वर्ग होना होगा। – Thomas

+0

@ थॉमस आपका क्या मतलब है "आंतरिक इंटरफेस समर्थित नहीं हैं"? वे आमतौर पर इस्तेमाल कर रहे हैं और कॉलबैक परिभाषित करने के लिए बहुत उपयोगी हैं। –

0

आप मार्कर इंटरफ़ेस को परिभाषित कर सकते हैं और इनर क्लास द्वारा कार्यान्वित कर सकते हैं।

<T implements CustomMarkerInterface> Class<T> some_method() 

तो यह OuterClass

public class Outer { 

    public class Inner implements CustomMarkerInterface{ 

    } 

    public class Inner1 implements CustomMarkerInterface{ 

    } 

    public class Inner2 implements CustomMarkerInterface{ 

    } 

} 
0

Class<InnerClass> के सभी भीतरी वर्गों के लिए लागू किया जाएगा जावा में अनुमति दी है। आप कुछ विशेष तालाश कर रहे हैं?

public class Client 
{ 
interface InnerType 
{ 
} 
public class InnerClass implements InnerType 
{ 
} 
public Class<? extends Client.InnerType> test() 
{ 
    return InnerClass.class; 
} 

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