大学のJavaの課題をやっていて、インターフェースを抽象クラスに書き直した際に遭遇したエラーです。
ディレクトリ
.
├── Main.java
├── Main.class
├── A.java
├── A.class
├── B.java
└── B.class
Aがインターフェース、BがAを実装したクラス、Mainが動作確認用のクラスです。
この後、Aをインターフェースではなく抽象クラスに書き直してコンパイルし、実行しようとしました。
$javac Main.java
$java Main
すると次のようなエラーが出ました。
Exception in thread "main" java.lang.IncompatibleClassChangeError: Found class A, but interface was expected
このエラー文を和訳すると「Aというクラスは見つかったけど、それはインターフェースじゃないとダメだよ」となります。そしてIncompatibleClassChangeErrorというのは
クラス定義に互換性のない変更があった場合にスローされます。現在実行中のメソッドが依存しているクラスの定義が、実行開始後に変更されています。
(Java(tm) Platform, Standard Edition 8 API仕様 から引用)
解決方法
A.class, B.class, Main.class の3つのファイルを削除しコンパイルするとうまく実行できました。