2012-12-11 15 views
5

मैं इस तरह एक अंतरफलक है:जावा जेनरिक: आंतरिक इंटरफेस एक आंतरिक (आंतरिक) superinterface से क्यों लागू नहीं कर सकता?

public interface SuperInterface { 
    public interface SubInterface { 
     public void get(); 
    } 
    //**More interfaces*/ 

} 

मेरी टूलकिट, में इस विधि जो सभी वस्तुओं जो एक निश्चित वर्ग के उदाहरण हैं पुन: प्राप्त करता:

public static <T> ArrayList<T> getSome(ArrayList<Object> objects, Class<T> clazz) { 
    ArrayList<T> result = new ArrayList<T>(); 
    for (Object o : objects) 
     if (clazz.isInstance(o)) 
      result.add(clazz.cast(o)); 
    return result; 
} 

MyClass वास्तव में दिलचस्प नहीं है, इसकी एक खाली वर्ग SuperInterface.SubInterface

से लागू करने और मुख्य में इस टुकड़े:

ArrayList<Object> mObjects = new ArrayList<Object>() { 
    { 
     add(new MyClass()); //SuperInterface.SubInterface 
     add(Integer.valueOf(5)); 
     add(new String("Hello")); 
     add(new Object()); 
    } 
}; 
ArrayList<SuperInterface> mSuperInterfaces = Toolkit.getSome(mObjects, SuperInterface.class); //returns a zero-sized list. 
ArrayList<SuperInterface.SubInterface> mSubInterfaces = Toolkit.getSome(mObjects, SuperInterface.SubInterface.class); //returns a one-sized list 

पहली विधि कॉल काम नहीं करता है जैसा कि मैंने आशा की थी, दूसरा करता है। क्या यह संभव है कि पहला व्यक्ति subinterfaces को एक अलग फ़ाइल में स्पष्ट रूप से डालने और सुपरक्लास को लागू किए बिना काम करता है? क्योंकि जाहिरा तौर पर subinterfaces नहीं हैं वास्तव में subinterfaces, तो मैं इस तरह इंटरफ़ेस वर्ग करने की कोशिश की:

public class ClassWithInterfaces { 
    public interface Super { } 
    public interface Sub implements Super { /**...*/ } 
} 

लेकिन जाहिरा तौर पर आप एक आंतरिक इंटरफ़ेस में implements उपयोग नहीं कर सकते।

मेरा प्रश्न है: क्यों है, और क्या मैं हासिल करना चाहता हूं (एक फ़ाइल में आंतरिक इंटरफेस) को पूरा करने का कोई तरीका है? मुझे जरूरी नहीं है कि मैं केवल यह जानना चाहता हूं कि आंतरिक इंटरफेस में कार्यान्वित करना क्यों संभव नहीं है (फिर भी आंतरिक कक्षाओं का विस्तार करना संभव है)।

उत्तर

6

लेकिन जाहिर है कि आप आंतरिक इंटरफ़ेस में implements का उपयोग नहीं कर सकते हैं।

आप extends बजाय implements लिए देख रहे हैं:

public class ClassWithInterfaces { 
    public interface Super { } 
    public interface Sub extends Super { /**...*/ } 
} 

यह मेरे लिए संकलित, और मैं निश्चित रूप से दोनों इंटरफेस को लागू कर सकते हैं।

  • एक इंटरफेस फैली एक और इंटरफ़ेस:

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

  • एक कक्षा एक इंटरफ़ेस लागू करता है।
  • एक कक्षा एक और कक्षा फैली हुई है।
+0

चूंकि इंटरफ़ेस से विस्तार करना संभव है? मैंने सोचा कि कीवर्ड अमूर्त वर्गों और इंटरफेस के बीच अंतर करने के लिए लागू होते हैं और विस्तार करते हैं? – stealthjong

+2

@ क्रिसिस्टेन्जोंग: एक इंटरफेस हमेशा * अन्य इंटरफेस बढ़ाता है, यह * उन्हें * लागू नहीं करता है। केवल एक वर्ग चीजों को लागू कर सकता है। – NPE

+0

अब जब आप इसका जिक्र करते हैं, तो यह वास्तव में काफी तार्किक है। बहुत बहुत धन्यवाद। – stealthjong

1

जावा भाषा विशिष्टता के अनुसार:

तो यहाँ आप दो कारणों से आप नहीं हो सकता 'असली' आंतरिक इंटरफेस

भी है , जैसा कि एनपीई लिखता है, एक इंटरफ़ेस कभी भी एक और इंटरफ़ेस लागू नहीं कर सकता है, यह केवल इसे बढ़ा सकता है। कक्षाएं इंटरफेस को कार्यान्वित कर सकती हैं और/या कक्षाओं का विस्तार कर सकती हैं, इंटरफेस केवल इंटरफेस का विस्तार कर सकते हैं। मेरे लिए बिल्कुल ठीक है।

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