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)
1. आप अभी कोशिश क्यों नहीं करते? 2. मैंने कहा कि कार्यान्वयन में "अतिरिक्त" फेंकता एक संकलन-समय त्रुटि संदेश भी उत्पन्न करता है। – TheBlastOne
@TheBlastOne मैंने कोशिश की। यह बढ़िया काम करता है। हो सकता है कि आपने मेरी पोस्ट को सही तरीके से नहीं पढ़ा हो - संकलन समय त्रुटि केवल तभी होगी जब मैं वाई – user93353