抽象クラスとその派生の組み合わせとインタフェースとその実装の組み合わせの同名のクラスを作り、これを参照するようにメインクラスを作っている。 そして、ビルド時と実行時で参照先が変わるようにした。
これでわかることは、変数の型に指定されるクラス名が完全一致しているなら変わっても問題が出ないが、派生元のクラス名(あるいはインタフェース名)が 使われているとだめ、ということ。
なお、src/Main.javaのbase_var_test()において、boolean b = d.isOk()をboolean b = ((Derived)d).isOk()とするとエラーにならない。 変数の型にはインタフェースやクラスといった区別はなさそうに見える。