JDKバージョン8+ターゲットバージョン7以下でIteratorコンパイルエラー
ハマった後で「ははーなるほどー」と感じた事象について。
EclipseでJavaプロジェクトをつくって開発をしていたのですが、その際のプロジェクトのJavaコンパイラ設定のターゲット・バージョンは6もしくは7にしていました。
一方で全体設定の「インストールされたJRE」のセクションではJDK8を選んでいる状態。
この状態のEclipseで、少なくともEclipseのアシストで自動挿入されるテンプレートコード(TODOコメント付きのアレ)をもとにIterator
の実装を行うと、Java8でdefault
メソッドになったremove()
は実装しない、あるいは少なくとも「実装しなくてもいい」ことになります。コンパイルエラーにもならないし、実行時エラーにもなりません。もちろんこうしてつくったコードを別環境のJDK7以下のコンパイラでコンパイルしようとするとコンパイルエラーになります。
これはJava8で導入されたdefault
メソッドに起因する問題ですのでIterator
に限った話ではないはずです。ターゲットバージョンを指定しているのに(少なくとも部分的に)Java8的にコンパイルされてしまう点にはちょっと疑問を感じざるを得ないですが、インストールされているJDKに付属の標準ライブラリのIterator
にはremove()
メソッドが事実存在しているので、そのJDKでコンパイルして付属のJREで実行する限りはきちんと(?)動作するコードになってしまうわけです。