2013-02-06 20 views
6

recompiling बिना इंटरफेस बदलने मैं निम्नलिखित वर्गोंको लागू करने वर्ग

public abstract interface X 
{ 
    public abstract void f() throws java.io.IOException; 
} 


public class Y implements X 
{ 
    public void f() throws java.io.IOException 
    { 
     throw new java.ioIOException("Hello"); 
    } 

    public static void main(String [] args) 
    { 
     X x = new Y(); 
     try 
     { 
      x.f(); 
     } 
     catch (IOException e) 
     { 
      System.out.println("Caught"); 
     } 
    } 

} 

अब मैं दोनों संकलन और X.class और Y.class प्राप्त की है।

अब मैं बदल फेंकता

public abstract interface X 
{ 
    public abstract void f(); 
} 

जाहिर है अगर मैं पुन: संयोजित दोनों एक्स & वाई, वाई के संकलन

Y.java:4: f() in Y cannot implement f() in X; overridden method does not throw j 
ava.io.IOException 

हालांकि असफल हो जायेगी दूर करने के लिए एक्स, मैं क्या करता है, तो केवल X.java & पुनः संकलित करें मेरे वाई। क्लास को रखें जो पुराने X.java के साथ संकलित किया गया था।

ऐसे मामले में क्या होता है - क्या यह अच्छी तरह परिभाषित है?

या यह अनिर्धारित श्रेणी के अंतर्गत आता है - यानी कुछ भी हो सकता है?

क्या कोई गारंटी है - यानी यदि मैं हमेशा जावा के तहत जावा 1.6.32 के तहत इसे चला रहा हूं, तो क्या मैं कुछ भी बुरा नहीं कर सकता?

अपडेट: इसे अपडेट किया गया क्योंकि कुछ उत्तरों ने कहा कि मुझे रनटाइम पर IncompatibleClassChangeError मिल जाएगा। लेकिन मैं नहीं करता।

कदम

1) दोनों X.java और Y.java संकलित रूप में ऊपर दिए गए। भागो वाई

आउटपुट:

2 पकड़ा) X.java बदलें बाहर टिप्पणी करने के लिए फेंकता है। पुन: संकलित X.java। पुन: संकलित Y.java नहीं।

भागो वाई

आउटपुट: पकड़ा

मैं विंडोज 7 पर

संकलक जावा चला रहा हूँ

javac 1.6.0_35 

रनटाइम

java version "1.6.0_35" 
Java(TM) SE Runtime Environment (build 1.6.0_35-b10) 
Java HotSpot(TM) Client VM (build 20.10-b01, mixed mode, sharing) 
+0

1. आप अभी कोशिश क्यों नहीं करते? 2. मैंने कहा कि कार्यान्वयन में "अतिरिक्त" फेंकता एक संकलन-समय त्रुटि संदेश भी उत्पन्न करता है। – TheBlastOne

+1

@TheBlastOne मैंने कोशिश की। यह बढ़िया काम करता है। हो सकता है कि आपने मेरी पोस्ट को सही तरीके से नहीं पढ़ा हो - संकलन समय त्रुटि केवल तभी होगी जब मैं वाई – user93353

उत्तर

3

यह अभी जावा में एक सीमा है। एक उप-इंटरफ़ेस बनाएं जो आपके वर्तमान इंटरफ़ेस को बढ़ाता है और अपवाद के बिना विधि को ओवरराइड करता है यदि आपको वास्तव में इसकी आवश्यकता है। आम तौर पर, इसे "बाइनरी चेंज" कहा जाता है और जब कोड चलता है तो टूटी हुई लिंकिंग में परिणाम होता है, और जेएलएस में अच्छी तरह से परिभाषित किया जाता है (उस पर एक पूरा अध्याय है, JLS 13, आप विशेष रूप से JLS 13.5 चाहते हैं)।

संपादित करें: आगे की जांच के बाद, यह पता चला कि मैं गलत था। JLS 13.4.21 से:

तरीकों या कंस्ट्रक्टर्स पूर्व मौजूदा binaries के साथ संगतता नहीं टूटते की throws खंड के

परिवर्तन; इन खंडों को केवल संकलन समय पर ही चेक किया जाता है।

हालांकि, मैं अभी भी ऐसा करने की अनुशंसा नहीं करता क्योंकि इसका मतलब यह है कि एक चेक अपवाद अनिवार्य रूप से रनटाइम पर अनचेक हो सकता है।

+0

का पुन: संकलित करता हूं तो डाउनवोट क्यों? – Brian

+0

जावा 8 'डिफ़ॉल्ट' यहां मदद नहीं करेगा। अपवाद को हटाने का एक नया तरीका नहीं बना रहा है। यह एक मौजूदा विधि को इस तरह से बदल रहा है जो इसके इंटरफ़ेस के साथ असंगत होगा। –

+0

@StephenC बाहर निकलता है मैं वैसे भी पूरी तरह गलत था, मेरा संपादन देखें। – Brian

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