क्या एक इंटरफ़ेस जावा में कई इंटरफेस बढ़ा सकता है?


126

क्या एक इंटरफ़ेस जावा में कई इंटरफेस बढ़ा सकता है? यह कोड मेरी IDE में मान्य है और यह संकलन करता है:

interface Foo extends Runnable, Set, Comparator<String> { }

लेकिन मैंने सुना था कि जावा में कई उत्तराधिकार की अनुमति नहीं थी। वहाँ इंटरफेस के लिए एक अपवाद क्यों प्रतीत होता है?


3
कौन से लेख कहते हैं कि यह संभव नहीं है? वे या तो गलत हैं, या आपने उन्हें गलत समझा और वे इंटरफेस के बजाय कक्षाओं के बारे में बात कर रहे हैं।

7
यह सवाल ऑफ-टॉपिक प्रतीत होता है क्योंकि इसका उत्तर स्व-अनुसंधान द्वारा आसानी से दिया जा सकता है
जोश

4
@StephenC यदि उन्हें लेखों का विरोधाभास मिला, तो उन्हें पोस्ट करना चाहिए। इस तरह से लोग उन लेखों को नहीं पढ़ना जानते हैं ...
लेकिन आई एम नॉट ए वेपर क्लास

10
इस सवाल के जवाब ने मेरा समय बचाया। मेरा तर्क है कि एक वैध प्रश्न के रूप में इसका मूल्य है।
xdhmoore

6
उपयोगी प्रश्न, मैंने यह अपेक्षा की कि मेरी IDE कुछ चेतावनियों को फेंक देगी, कोई भी देखकर चकित रह गया। इसलिए मैंने अनजाने में गूगल में वही सवाल टाइप कर दिया, जो ऑप का है जिसने मुझे कुछ जवाब / पुष्टि के साथ इस पेज
आर्थर

जवाबों:


170

हां तुम यह कर सकते हो। जैसा कि यहां दिखाया गया है, एक इंटरफ़ेस कई इंटरफेस बढ़ा सकता है:

interface Maininterface extends inter1, inter2, inter3 {  
  // methods
}

एक एकल वर्ग भी कई इंटरफेस को लागू कर सकता है। क्या होगा अगर दो इंटरफेस में एक ही नाम और हस्ताक्षर को परिभाषित करने की विधि है?

एक मुश्किल बिंदु है:

interface A {
    void test();
}

interface B {
    void test();
}

class C implements A, B {

    @Override
    public void test() {

    }     

}

फिर एकल कार्यान्वयन दोनों के लिए काम करता है :)।

मेरी पूरी पोस्ट यहाँ पढ़ें:

http://codeinventions.blogspot.com/2014/07/can-interface-extend-multiple.html


@RahulBhadana सार विधि सही ओवरराइड करना चाहिए?
सुरेश अत्ता

13
क्या होगा अगर आपके पास इंटरफेस ए है void test()और इंटरफ़ेस बी के साथ है boolean test()? (क्या यह हीरे की समस्या का चचेरा भाई है ?) __Tried और समझदार बात होती है: अनुमति नहीं है अगर वापसी प्रकार अलग है।
डेनियल

@ सुरेशता - तो क्या होता है? क्या यह दोनों को बुलाता है ??
फेटी

4
एक वर्ग अलग-अलग रिटर्न प्रकार के साथ 2 विधियों को एक ही हस्ताक्षर की अनुमति नहीं देता है। stackoverflow.com/questions/16149285/…
निन्ह फाम

73

एक इंटरफ़ेस कई इंटरफेस का विस्तार कर सकता है

एक वर्ग कई इंटरफेस को लागू कर सकता है

हालांकि, एक वर्ग केवल एक ही वर्ग का विस्तार कर सकता है ।

सावधान कैसे आप शब्दों का प्रयोग extendsऔर implementsजब के बारे में बात interfaceऔर class


8

क्या एक इंटरफ़ेस जावा में कई इंटरफेस बढ़ा सकता है?

उत्तर है: हाँ।

जेएलएस के अनुसार

एक इंटरफ़ेस को एक या अधिक अन्य इंटरफेस का प्रत्यक्ष विस्तार घोषित किया जा सकता है, जिसका अर्थ है कि यह किसी भी सदस्य प्रकार और स्थिरांक को छोड़कर सभी सदस्यों के प्रकार, सार विधियों और निहितार्थ के विस्तार को निर्दिष्ट करता है, जिसे वह छिपा सकता है।


JLS = "जावा लैंग्वेज स्पेसिफिकेशन" जो इन प्रश्नों में आधिकारिक स्रोत है।
होन्ट्री लेवेंटे

6

ओरेकल प्रलेखन पृष्ठ से कई उत्तराधिकार प्रकार के बारे में, हम यहां सटीक उत्तर पा सकते हैं । यहाँ हमे पहले पता होना चाहिए कि जावा में कई तरह की विरासत है: -

  1. राज्य की कई विरासत।
  2. कार्यान्वयन की एकाधिक विरासत।
  3. प्रकार की एकाधिक विरासत।

जावा "राज्य की कई विरासत का समर्थन नहीं करता है, लेकिन यह जावा 8 रिलीज के बाद से डिफ़ॉल्ट तरीकों के साथ कार्यान्वयन के कई विरासत का समर्थन करता है और इंटरफेस के साथ कई प्रकार का विरासत है।

फिर यहाँ "हीरे की समस्या" के लिए सवाल उठता है और जावा कैसे निपटता है: -

  1. कार्यान्वयन के कई उत्तराधिकार के मामले में जावा संकलक संकलन त्रुटि देता है और उपयोगकर्ता को इंटरफ़ेस नाम निर्दिष्ट करके इसे ठीक करने के लिए कहता है। यहाँ उदाहरण: -

                interface A {
                    void method();
                }
    
                interface B extends A {
                    @Override
                    default void method() {
                        System.out.println("B");
                    }
                }
    
                interface C extends A { 
                    @Override
                    default void method() {
                        System.out.println("C");
                    }
                }
    
                interface D extends B, C {
    
                }

तो यहाँ हम इस प्रकार त्रुटि प्राप्त करेंगे: - इंटरफ़ेस D, विधि B (C) से विधि () के लिए असंबंधित चूक प्राप्त करता है और D इंटरफ़ेस B, C को विस्तारित करता है

आप इसे ठीक कर सकते हैं: -

interface D extends B, C {
                @Override
                default void method() {
                    B.super.method();
                }
            }
  1. जावा के कई वंशानुक्रम में यह अनुमति देता है क्योंकि इंटरफ़ेस में परिवर्तन योग्य क्षेत्र नहीं होते हैं और केवल एक कार्यान्वयन वर्ग का होगा इसलिए जावा कोई भी मुद्दा नहीं देता है और यह आपको ऐसा करने की अनुमति देता है।

निष्कर्ष में हम कह सकते हैं कि जावा राज्य के कई उत्तराधिकार का समर्थन नहीं करता है, लेकिन यह कार्यान्वयन के कई उत्तराधिकार और प्रकार के कई वंशानुक्रम का समर्थन करता है


1
मुझे लगता है कि यह एक अधिक उपयुक्त उत्तर है और प्रश्न के लिए अधिक स्पष्ट करता है। +1
केतन जोशी

धन्यवाद @KetanJoshi यह एक बहुत पर ले जाने के लिए प्रेरित करता है :)
शंकर

4

आप कई का विस्तार कर सकते हैं, Interfacesलेकिन आप कई का विस्तार नहीं कर सकते classes

कई वर्गों को विस्तारित करने के लिए जावा में यह संभव नहीं है, यह C ++ से खराब अनुभव है जहां यह संभव है।

मल्टीपिट इनहेरिटेंस का विकल्प यह है कि एक वर्ग कई इंटरफेस को लागू कर सकता है (या एक इंटरफ़ेस कई इंटरफेस को बढ़ा सकता है)


2

मुझे लगता है कि आपका भ्रम कई विरासतों के साथ है, जिसमें ऐसा करना बुरा है और जावा में यह भी संभव नहीं है। हालांकि, जावा में कई इंटरफेस लागू करने की अनुमति है और यह सुरक्षित भी है।


2

एक जावा वर्ग केवल एक मूल वर्ग का विस्तार कर सकता है। एकाधिक वंशानुक्रम की अनुमति नहीं है। इंटरफेस, कक्षाएं नहीं हैं, हालांकि, और एक इंटरफ़ेस एक से अधिक मूल इंटरफ़ेस का विस्तार कर सकता है।

उदाहरण के लिए, यहां देखें: http://www.tutorialspoint.com/java/java_interfaces.htm

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.