2012-09-21 2 views
6

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

वहाँ किसी भी तरह से मैं संशोधित कर सकते हैं इंटरफ़ेस ऐसा है कि मुझे क्या करना ही कर सकता है:

C c = new C(); 
c.add(new C()); 

, लेकिन नहीं

c.add(new D()); 

?

मैं एक परीक्षा पर इस सवाल का था, लेकिन अपने ही विचार विधि की परिभाषा में instanceof ऑपरेटर का उपयोग करने के लिए किया गया था:

class C implements I { 
    public void add(I foo) { 
     if (foo instanceof C) { 
      System.out.println("instance of C"); 
     } else { 
      System.out.println("another instance"); 
     } 
    } 
} 

हालांकि, मैं इंटरफ़ेस संशोधित करने के लिए पता नहीं कैसे जैसे कि मैं एक ही प्रभाव उत्पन्न करता हूं। -

धन्यवाद

उत्तर

7

हाँ आप जेनरिक की जरूरत है:

interface I <T extends I<T>> { 
    void add(T foo); 
} 

इसका इस्तेमाल करने के लिए एक वर्ग को परिभाषित करने के लिए, इस तरह कोड यह:

class C implements I<C> { 
    @Override 
    public void add(C foo) { 
     // 
    } 
} 

नोट को रोकने के लिए कोई रास्ता नहीं है कि वहाँ इस कोडिंग से कार्यान्वयनकर्ता (मानते हैं कि D भी I लागू करता है):

class C implements I<D> { 
    @Override 
    public void add(D foo) { 
     // 
    } 
} 

हालांकि, यह केवल एक समस्या है, तो वर्ग C की सांकेतिक शब्दों में बदलनेवाला वर्ग D के अस्तित्व का पता था और जो संभावना नहीं है अगर वे वर्ग C कोडिंग पर ध्यान केंद्रित कर रहे हैं इसका इस्तेमाल करने के लिए चुना होगा।

यहां तक ​​कि यह चेतावनी दी गई है, अगर मैं इस परीक्षा प्रश्न को स्थापित कर रहा हूं, तो मैं उपर्युक्त उत्तर का उत्तर दूंगा।

+1

यह विधि मूर्ख-प्रमाण नहीं है। उदाहरण के लिए, आप अभी भी 'कक्षा डी उपकरण I ' जैसी कुछ कर सकते हैं। हालांकि, यह इरादे का एक बहुत ही मजबूत संकेतक है, और उपरोक्त उल्लंघन करने वाला देव जो कुछ भी प्राप्त करता है वह पात्र है। – Dunes

+2

अपरिवर्तित प्रकार के बारे में चेतावनी से बचने के लिए, घोषणा 'इंटरफेस I <टी' > 'विस्तारित होनी चाहिए। –

+0

@ बोहेमियन धन्यवाद! – Claudiu

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

  • कोई संबंधित समस्या नहीं^_^