यह, वास्तव में, एक बहुत अच्छा सवाल है, तो, उदाहरण के लिए, आप एक Innner
वर्ग हिस्से की दो अलग-अलग उदाहरणों Outer
वर्ग (== का एक ही उदाहरण या संदर्भ के आधार पर बराबर अगर जाँच करने के लिए सक्षम होना चाहिए है)।
मैं एक सामान्य प्रयोजन इंटरफ़ेस बनाने के लिए सुझाव देंगे (बिल्कुल नामित इनर क्लासों के लिए आवश्यक नहीं है, लेकिन "instancedof"/करने के लिए casted जा सकता है):
public interface InnerClass<Outer> {
Outer getOuter();
}
है कि किसी भी नामित भीतरी वर्ग के लिए लागू किया जा सकता ।
तो फिर तुम जैसे कुछ कार्य करें:
class MyInnerClass implements InnerClass<Outer> {
Outer getOuter() {
return Outer.this;
}
// remaining implementation details
}
और इस तरह से आप किसी भी भीतरी वर्ग InnerClass<Outer>
इंटरफेस को लागू करने से बाहरी वर्ग का उपयोग (और जाँच यह वास्तव में यह लागू करता है) कर सकते हैं।
तो अपने भीतर के वर्ग अनाम है, आप केवल (अपने नमूने के लिए रिच मैकडोनाल्ड करने के लिए धन्यवाद) कर सकते हैं:
new InterfaceOrAbstractClass<Outer>() {
Outer getOuter() { // super inefficient but this is the only way !
return (Outer)getClass().getDeclaredField("this$0");
}
/* other methods */
}
लेकिन InterfaceOrAbstractClass
चाहिएInnerClass<Outer>
लागू करता है गुमनाम की getOuter()
बाहर तक पहुँचने के लिए सक्षम होने के लिए कक्षा शरीर!
यदि जावा ने स्वचालित रूप से सभी आंतरिक वर्गों पर InnerClass<Outer>
इंटरफेस को स्वचालित रूप से कार्यान्वित किया तो यह बहुत आसान होगा, और यह अज्ञात वर्गों (कोई सुस्त आत्मनिरीक्षण प्रसंस्करण) पर भी सुपर कुशलता से ऐसा नहीं कर सकता है!
स्रोत
2012-07-14 10:48:06
आप समझा सकता है कि समस्या क्या आप को हल करते हैं? या यह अकादमिक है? –
अकादमिक, मुख्य रूप से। इसके जवाब में आने पर मैं इसे पार कर गया: http://stackoverflow.com/questions/763359/validating-instances-of-inner-classes/763504 मैंने दो जवाब दिए, एक ऐसा कर रहा था जो ओपी उपयोग करने के लिए कह रहा था मैं वही कामकाज ऊपर उपयोग करता हूं (एक getOuter() विधि)। लेकिन मेरे दूसरे उत्तर में (जिसे एक उखाड़ फेंक दिया गया है) मैंने इसे एक अलग तरीके से डिजाइन करने के लिए कहा ताकि यह आवश्यक न हो। लेकिन अगर मैं ऐसा करना संभव था तो मैं अभी भी उत्सुक था। – Kip
आपका प्रदान किया गया उदाहरण इस प्रश्न का सबसे अच्छा जवाब है। – Pindatjuh