Java SE 8 の非互換性

まず Java SE 7 の java.lang.refrect.TypeVariable と Java SE 8 の java.lang.refrect.TypeVariable を比べてほしい。簡潔に書けば Java SE 8 で getAnnotatedBounds() が追加されたことが分かるはずである。

このように既存のインターフェースにメソッドが追加された場合、このインターフェースを実装するクラスはそのままでは Java SE 8 でコンパイルできなくなってしまう。通常なら追加されたメソッドの実装を追加すれば解決するのであるが、ここで getAnnotatedBounds() の戻り型 AnnotatedType[] に注目してほしい。java.lang.reflect.AnnotatedType は Java SE 8 で追加されたので、Java SE 7 には存在していない。つまり getAnnotatedBounds() を実装してしまうと Java SE 7 ではもうコンパイルできなくなってしまうのである。何という非互換性だろうか。

本来なら新しいメソッドを追加した別のインターフェースを追加するか、Java SE 7 のクラス実装のままでもコンパイル可能なようにデフォルト メソッドを提供するべきだったのでしょうが、そこまで気が回らなかったんでしょうかねえ。