Javaのクラスとインタフェースはバイナリ互換性がない

投稿日:

サンプルコード

例えば以下のようなコードがあります。

class Foo {
  public void exec() {
    System.out.println("foo");
  }
}

class FooFactory {
  public static Foo createFoo() {
    return new Foo();
  }
}

class Main {
  public static void main(String[] args) {
    Foo foo = FooFactory.createFoo();
    foo.exec();
  }
}

実行結果は以下のとおりです。

$ java Main
foo

このFooをインタフェースにします。 Mainクラスはそのままです。

interface Foo {
  public void exec();
}

class Bar implements Foo {
  public void exec() {
    System.out.println("bar");
  }
}

class FooFactory {
  public static Foo createFoo() {
    return new Bar();
  }
}

このMainクラスを再コンパイルせずに実行すると、以下のようなエラーが出ます。

$ java Main
Exception in thread "main" java.lang.IncompatibleClassChangeError: Found interface Foo, but class was expected
    at Main.main(Main.java:4)

Mainクラスを再コンパイルすると、以下のようになります。

$ java Main
bar

辞書

  • Java
  • abi: まだありません。