M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

JDKバージョン8+ターゲットバージョン7以下でIteratorコンパイルエラー

ハマった後で「ははーなるほどー」と感じた事象について。

EclipseJavaプロジェクトをつくって開発をしていたのですが、その際のプロジェクトのJavaコンパイラ設定のターゲット・バージョンは6もしくは7にしていました。

f:id:m12i:20160212081204p:plain

一方で全体設定の「インストールされたJRE」のセクションではJDK8を選んでいる状態。

f:id:m12i:20160212081400p:plain

この状態のEclipseで、少なくともEclipseのアシストで自動挿入されるテンプレートコード(TODOコメント付きのアレ)をもとにIteratorの実装を行うと、Java8でdefaultメソッドになったremove()は実装しない、あるいは少なくとも「実装しなくてもいい」ことになります。コンパイルエラーにもならないし、実行時エラーにもなりません。もちろんこうしてつくったコードを別環境のJDK7以下のコンパイラコンパイルしようとするとコンパイルエラーになります。

これはJava8で導入されたdefaultメソッドに起因する問題ですのでIteratorに限った話ではないはずです。ターゲットバージョンを指定しているのに(少なくとも部分的に)Java8的にコンパイルされてしまう点にはちょっと疑問を感じざるを得ないですが、インストールされているJDKに付属の標準ライブラリのIteratorにはremove()メソッドが事実存在しているので、そのJDKコンパイルして付属のJREで実行する限りはきちんと(?)動作するコードになってしまうわけです。