2011-03-23 17 views
8

नीचे मेरे पास एक सामान्य ओटर क्लास है, एक इनर क्लास जो बाहरी क्लास जेनरिक और गैर-जेनेरिक इनर इंटरफेस का उपयोग करता है।आंतरिक कक्षा और आंतरिक इंटरफेस के साथ जावा जेनरिक

public class OuterClass<E> { 

    public class InnerClass { 

     public E someMethod() { 
      return null; 
     } 
    } 

    public interface InnerInterface{ 
     public void onEvent(OuterClass.InnerClass innerClass); 
    } 
} 

नीचे दी गई मुख्य विधि में, मैं बाहरी क्लाउड के दो उदाहरण, ओ 1 पैरामीटर के साथ, और ओ 2 के साथ उपयोग करता हूं। मेरा बेनामी आंतरिक वर्ग myListener बाहरी वर्ग (ई) के सामान्य प्रकार का उपयोग करने की कोशिश करता है। जैसा कि कोड नीचे है, संकलित नहीं करता है (इंटीजर i = innerClass.someMethod() - मिस्चैच टाइप करें: ऑब्जेक्ट से इंटीजर में कनवर्ट नहीं किया जा सकता है)।

public class Test { 
    public static void main(String[] args) { 

     OuterClass<Integer> o1 = new OuterClass<Integer>(); 
     OuterClass<String> o2 = new OuterClass<String>(); 

     OuterClass.InnerInterface innerInterface = new OuterClass.InnerInterface() { 
      @Override 
      public void onEvent(InnerClass innerClass) { 
       Integer i = innerClass.someMethod(); 
      } 
     }; 
    } 
} 

मुझे लगता है कि myListener व्यक्त करना चाहेंगे O1 के लिए है, और ई = पूर्णांक का उपयोग करना चाहिए, यह दोहराए बिना (दोहराए बिना, मैं पहले से ही यह जब O1 घोषित कहते हैं)। क्या यह संभव है?

बहुत धन्यवाद! फैटन।

+0

आपकी इंटरफ़ेस विधि को भी सामान्यीकृत करने की आवश्यकता है। – Bombe

उत्तर

13

एक आंतरिक इंटरफ़ेस या enum निश्चित रूप से स्थैतिक है, और स्थिर सदस्यों को बाहरी वर्ग के प्रकार पैरामीटर के साथ पैरामीटर नहीं किया गया है। तो InnerInterface इस तरह दिखना चाहिए:

public interface InnerInterface<E> { 
    void onEvent(OuterClass<E>.InnerClass innerClass); 
} 

ध्यान दें कि InnerInterface की E पैरामीटर नहींOuterClass की E पैरामीटर के रूप में एक ही है।

+8

शायद, तो बेहतर होगा कि इसे ई कॉल न करें? – Ingo

+2

धन्यवाद लॉरेन। यह काम करेगा, लेकिन मुझे दोहराना होगा क्योंकि यह एक अलग ई है। मेरा सवाल था "क्या पहले ई = का पुन: उपयोग करना संभव है", और इंटरफेस के लिए को फिर से चलाने से रोकें? – Faton

+1

सामान्य पैरामीटर के लिए समान पहचानकर्ता का उपयोग करने के लिए शायद एक अच्छा विचार नहीं है। –

1

हमेशा के रूप में, गैर-private नेस्टेड प्रकार चीजों को सरल रखने में मदद नहीं करते हैं। नाव को पुश करें और कुछ नई फाइलें बनाएं, भले ही आपका आईडी आपके खिलाफ काम करता हो।

वैसे भी, कक्षा के स्थिर सदस्य बाहरी वर्ग के सामान्य मानकों को साझा नहीं करते हैं। यह फ़ील्ड के व्यवहार के लिए महत्वपूर्ण है, और यदि आप इसे नहीं चाहते हैं तो भी स्थिर नेस्टेड प्रकारों (जैसे InnerInterface) पर अधिक लचीलापन की अनुमति देता है। तो, आपके मामले में, आपको अपने (स्थिर) नेस्टेड इंटरफ़ेस को एक सामान्य पैरामीटर देना होगा। $ देवता के लिए, एक अलग पहचानकर्ता का उपयोग करें!

public class OuterClass<E> { 
    public class InnerClass { 
     public E someMethod() { 
      return null; 
     } 
    } 

    public interface InnerInterface<T> { 
     void onEvent(OuterClass<T>.InnerClass innerClass); 
    } 
} 


public class Test { 
    public static void main(String[] args) { 

     OuterClass<Integer> o1 = new OuterClass<Integer>(); 
     OuterClass<String> o2 = new OuterClass<String>(); 

     OuterClass.InnerInterface<Integer> innerInterface = 
      new OuterClass.InnerInterface<Integer>() 
     { 
      @Override 
      public void onEvent(OuterClass<Integer>.InnerClass innerClass) { 
       Integer i = innerClass.someMethod(); 
      } 
     }; 
    } 
} 

(मैं भी InnerClass योग्य गए जहां आवश्यक।)

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

public interface InnerInterface{ 
    public void onEvent(OuterClass.InnerClass innerClass); 
} 

    OuterClass.InnerInterface innerInterface = new OuterClass.InnerInterface() { 
     @Override 
     public void onEvent(InnerClass innerClass) { 
      Integer i = innerClass.someMethod(); 
     } 
    }; 
: यह शायद सिर्फ उपयोग के बाकी हिस्सों से अलग-थलग मूल गुमनाम आंतरिक वर्ग को देख लायक है

Integer केवल एक बार दिखाई देता है, एक जगह जहां यह स्पष्ट रूप से सही होने के लिए अनुमानित नहीं किया जा सकता है।

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