私は次のクラスを持っています
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
ます。
ここで、X を変更してスローを削除します
public abstract interface X
{
public abstract void f();
}
明らかに、X と Y の両方を再コンパイルすると、Y のコンパイルは失敗します。
Y.java:4: f() in Y cannot implement f() in X; overridden method does not throw j
ava.io.IOException
ただし、X.java を再コンパイルし、古い X.java でコンパイルされた Y.class を保持する場合はどうすればよいでしょうか。
そのような場合はどうなりますか - それは明確に定義されていますか?
それとも、未定義のカテゴリに分類されますか?つまり、何かが起こる可能性がありますか?
保証はまったくありますか? つまり、Windows で常に Java 1.6.32 の下で実行している場合、悪いことが起こらないことに頼ることができますか?
更新:IncompatibleClassChangeError
実行時に取得すると回答があったため、更新しました。しかし、私はしません。
手順
1) 上記のように X.java と Y.java の両方をコンパイルします。Y を実行します。
出力: キャッチ
2) X.java を変更して、スローをコメント化します。X.java を再コンパイルします。Y.java を再コンパイルしないでください。
実行 Y
出力: キャッチ
Windows 7でJavaを実行しています
コンパイラ
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)